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

分类: 计算机技术
推荐阅读:
Rust实现冒泡排序算法(Bubble Sort) 本文将使用Rust语言实现冒泡排序算法;
一条Linux命令让你看起来很忙还很酷 在Linux系统下,如果你想让你的终端看起来很忙,或者想在某人面前装酷,那么你一定需要这条命令来实现:
Python数组求和 给定一个数组,使用Python进行数组求和;
Python vars()函数 vars() 函数返回对象的属性和属性值的字典。其语法如下:
从PyInstaller打包生成的EXE文件中提取Python源码 本文将详细讲解怎么使用 pyi-archive_viewer 和 uncompyle6 工具提取pyinstaller打包生成的EXE中的pyc文件,并将其正确的解码成py源码。
Python locals()函数 在 Python 中,locals() 是一个内置函数,用于返回当前作用域中的所有局部变量的字典。在函数内部,locals() 返回该函数的局部变量。在模块级别上,locals() 返回全局变量。