MySQL自带的加解密函数主要有以下3对:
- ENCODE()、DECODE()
已在5.7.2版本弃用,目前仍可用,但将在后续版本中删除。
- DES_ENCRYPT()、DES_DECRYPT()
已在5.7.6版本弃用,目前仍可用,但将在后续版本中删除。
- AES_ENCRYPT()、AES_DECRYPT()
推荐使用这对加解密函数。aes_encrypt()和aes_decrypt()使用官方的aes(高级加密标准)算法(以前称为“rijndael”)实现数据的加密和解密。
加密后的二进制串长度可以通过下面公式计算:
16 * (trunc(string_length / 16) + 1)
MySQL版本小于5.7.4:
函数参数:
AES_ENCRYPT(str,key_str),其中str为待加密字符串,key_str为秘钥
AES_DECRYPT(crypt_str,key_str),其中crypt_str为已加密的二进制串,key_str为秘钥
例:
创建表,插入加密字段,秘钥为‘keykey’查询出的结果为密文:
使用错误的key解密,结果为NULL:
使用正确的key解密:
MySQL版本大于等于5.7.4:
函数参数:
AES_ENCRYPT(str,key_str[,init_vector]),其中str为待加密字符串,key_str为秘钥,其中init_vector根据选择不同的块加密模式为可选项
AES_DECRYPT(crypt_str,key_str[,init_vector]),其中crypt_str为已加密的二进制串,key_str为秘钥,其中init_vector根据选择不同的块加密模式为可选项
st和key_str参数可以是任何长度,init_vector参数不得小于16个字符。
可以通过block_encryption_mode参数,控制块加密模式,默认值为:aes-128-ecb。可配置的形式为:aes-keylen–mode。
其中:
keylen可配置为128, 192, 256
mode可配置为ECB, CBC, CFB1, CFB8, CFB128, OFB
下表展示了不同mode是否需要init_vector参数。
Block Encryption Mode | SSL Libraries that Support Mode | Initialization Vector Required |
ECB | OpenSSL, yaSSL | No |
CBC | OpenSSL, yaSSL | Yes |
CFB1 | OpenSSL | Yes |
CFB8 | OpenSSL | Yes |
CFB128 | OpenSSL | Yes |
OFB | OpenSSL | Yes |
默认的ECB模式不需要init_vector参数,用法与5.7.4以前相同。
例:
修改块加密模式:
该模式下再使用两参数加密报错:
三参数加密:
解密成功: