MySQL AES_ENCRYPT()、AES_DECRYPT()函数
AES_ENCRYPT()
和AES_DECRYPT()
使用官方AES算法实现数据的加密和解密;其密钥默认长度为128位,默认块加密模式为ECB;
AES_ENCRYPT(str,key_str[,init_vector])
该函数使用密钥key_str
对str
进行加密,返回已加密的数据;key_str
长度达不到密钥长度时会自动填充,超过则忽略;如何定义密钥长度请参阅后文;
AES_DECRYPT(crypt_str,key_str[,init_vector])
该函数使用密钥key_str
对已加密数据crypt_str
进行解密,并返回原始明文;key_str
长度达不到密钥长度时会自动填充,超过则忽略;如何定义密钥长度请参阅后文;
加密解密例子:
SET @key_str = 'my secret key';
set @crypt_str = AES_ENCRYPT('明文',@key_str);
SELECT AES_DECRYPT(@crypt_str,@key_str);
+--------------------------------------------------------------------+
| AES_DECRYPT(@crypt_str,@key_str) |
+--------------------------------------------------------------------+
| 0xE6988EE69687 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)
如果AES_ENCRYPT()
在mysql客户端中调用,则返回的二进制字符串可能使用十六进制表示法显示,它取决于--binary-as-hex
;
init_vector初始化向量
AES_ENCRYPT()
和AES_DECRYPT()
函数允许使用可选参数init_vector
为基于块加密模式的算法提供初始化向量;
块加密模式可通过系统变量block_encryption_mode
指定,默认值为aes-128-ecb
,它表示使用128位长度的密钥和ECB模式进行加密;而ECB模式不需要提供初始化向量,所以上文的示例没有使用init_vector
参数;
以下表格列出了支持的块加密模式,以及是否需要初始化向量;
块加密模式 | 是否需要初始化向量 |
---|---|
ECB | 不需要 |
CBC | 需要 |
CFB1 | 需要 |
CFB8 | 需要 |
CFB128 | 需要 |
OFB | 需要 |
init_vector
参数长度必须为16字节,超过16字节将忽略;
对于不需要初始化向量的块加密模式,如果指定了初始化向量,则会生成警告;
通常我们可以调用RANDOM_BYTES(16)
生成随机向量;加密和解密必须使用相同的向量;
例
这个例子将修改块加密模式位CBC,使用RANDOM_BYTES(16)
生成向量,进行加密和解密;
SET block_encryption_mode = 'aes-128-cbc';
SET @key_str = 'my secret key';
SET @init_vector = RANDOM_BYTES(16);
SET @crypt_str = AES_ENCRYPT('message',@key_str,@init_vector);
SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);