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 debug_assert宏的用法和示例 在Rust中,debug_assert宏是一个用于在调试时检查条件的宏;它类似于assert宏,不同之处在于debug_assert仅在Rust编译器的debug模式下进行检查,而在release模式下被完全忽略。
Rust:if this is intentional, prefix it with an underscore解决方法 编译Rust程序时提示:if this is intentional, prefix it with an underscore: `_x`,这表明存在一个未使用的变量 x,你可以将其删除或在变量名前添加一个下划线前缀;
Python实现猜拳小游戏 曾经给一个小屁孩做的作业,放出来分享。。。实现思路: 定义一个玩家类;实现获取用户的输入。 定义一个机器人类;实现机器人的输入。 定义一个裁判类;裁判判断双方胜负。 定义游戏桌面;实现游戏的启动和管理。
C语言计算卡特兰数(catanlan number) 卡特兰数(Catalan number),是组合数学中一种常出现于各种计数问题中的数列;本文使用C语言来计算卡特兰数;
Python实现列表去重的多种方法及性能对比 本文将通过多种方法实现列表(List)去重(将列表中的重复项删除);其中包括使用常规方法去重、set()集和去重、使用enumerate()去重、和使用collections.OrderedDict.fromkeys()实现去重;并编写了测试代码来测试这些去重方法的性能、以及去重后元素的排序是否改变;
Linux终端如何输入复杂的命令 在Linux下,当你要输入的命令过于复杂,比如有许多参数,你可以先按 ctrl + x ,再按 ctrl + e 快速打开一个编辑器编辑命令。