MySQL加解密函数

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-keylenmode

其中:

keylen可配置为128, 192, 256

mode可配置为ECB, CBC, CFB1, CFB8, CFB128, OFB

下表展示了不同mode是否需要init_vector参数。

Block Encryption ModeSSL Libraries that Support ModeInitialization Vector Required
ECBOpenSSL, yaSSLNo
CBCOpenSSL, yaSSLYes
CFB1OpenSSLYes
CFB8OpenSSLYes
CFB128OpenSSLYes
OFBOpenSSLYes

默认的ECB模式不需要init_vector参数,用法与5.7.4以前相同。

例:

修改块加密模式:

该模式下再使用两参数加密报错:

三参数加密:

解密成功: