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

分类: 计算机技术
推荐阅读:
Linux终端给命令设置超时 在Linux系统下,有这么个场景,当你运行一条命令,你希望它在指定时间后,如果它还在运行,就自动结束它,那你可以通过这一条命令实现:
Linux结束正在锁定文件的进程 在Linux系统下,当你想删除或更改某个文件,却发现该文件正在被某个进程访问,处于锁定状态,导致你无法删除或更改;这时你只需要一条命令即可实现结束这个进程:
Windows安装Visual Studio Code Visual Studio Code 是一个运行于Mac OS、Windows、Linux之上的,针对于编写现代Web 和运用的跨平台源代码编辑器;
Python中__getitem__()方法和索引器[]的详细用法 在本文中将详细描述如何使用Python为自定义对象使用索引器和类的__getitem__()方法;
Python eval()函数 在Python中,eval()是一个内置函数,用于将一个字符串作为Python表达式执行,并返回表达式的结果。
使用PySide6创建Hello World程序 本文将展示PySide6的hello world程序;程序将创建一个主窗体,在窗体上创建一个按钮,点击按钮将弹出Hello world的消息;