MySQL AES_ENCRYPT()、AES_DECRYPT()函数

AES_ENCRYPT()AES_DECRYPT()使用官方AES算法实现数据的加密和解密;其密钥默认长度为128位,默认块加密模式为ECB;

AES_ENCRYPT(str,key_str[,init_vector])

该函数使用密钥key_strstr进行加密,返回已加密的数据;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);

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/mysql-function-aes-encrypt-decrypt.html

分类: 计算机技术
推荐阅读:
MySQL ACOS() 反余弦函数 ACOS(x)函数返回x的反余弦值;如果x不在定义域[-1,1]中,将返回NULL;
C语言生成指定长度的字符串密码 在C语言中使用当前时间和进程识别码作为随机种子,生成一个指定长度,内容随机的字符串密码;
MySQL ABS() 绝对值函数 ABS(x) 函数返回x的绝对值,如果x为NULL则返回NULL;
创建WEB服务来访问当前目录 在Linux系统下,只需要一条简单的命令即可实现:创建一个WEB服务用来访问当前的目录。
Python reversed()函数 在 Python 中,reversed() 函数用于反转序列(例如列表、元组、字符串等)中的元素,并返回一个迭代器。可以将这个迭代器转换为列表、元组或其他类型的序列。
Python all()函数 all()是Python内置函数之一,它接收一个可迭代对象,如果可迭代对象中的所有元素都为真值(非零、非空、非None等),则返回True,否则返回False。