AES_ENCRYPT
声明
AES_ENCRYPT(str,key_str[,init_vector])
说明
使用密钥字符串 key_str 对字符串 str 进行加密并返回加密后的二进制字符串。str 没有长度限制,该函数会将 str 自动填充至加密块的整数倍。密文长度的计算公式为:
16 * (trunc(string_length / 16) + 1)
如果任一函数参数为 NULL,则该函数返回 NULL。
AES_ENCRYPT()使用官方 AES(Advanced Encryption Standard)算法实现数据的加密。AES 标准允许使用各种密钥长度,默认为 128 位。也可以使用 196 或 256 位的密钥长度。密钥长度越长,安全性越高,但加密速度降低。
AES_ENCRYPT() 与 AES_DECRYPT() 函数可通过初始化向量控制块加密模式:
-
block_encryption_mode系统变量用于控制基于块的加密算法的模式。默认值为aes-128-ecb,表示使用 128 位密钥长度和 ECB 模式进行加密。 -
init_vector参数表示初始化向量:-
当加密模式需要设置
init_vector参数时,其长度必须是 16 字节及以上(超过 16 的字节将被忽略)。如果缺少init_vector,则会发生错误。 -
当加密模式不需要设置
init_vector参数时,则该参数会被忽略。
对于需要初始化向量的加密模式,加密和解密必须使用相同的向量。
SET block_encryption_mode = 'aes-256-cbc';
SET @key_str ='My secret passphrase';
SET @init_vector = '1111111111111111';
SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);
+-----------------------------------------------+
| AES_DECRYPT(@crypt_str,@key_str,@init_vector) |
+-----------------------------------------------+
| text |
+-----------------------------------------------+
1 row in set (0.001 sec)下表列出了块加密模式、支持 的 SSL 库以及是否需要初始化向量参数的详细信息。
块加密模式 支持的 SSL 库 是否需要初始化向量 ECB OpenSSL 否 CBC OpenSSL 是 CFB1 OpenSSL 是 CFB8 OpenSSL 是 CFB128 OpenSSL 是 OFB OpenSSL 是 -
示例
-
将
'hello world'加密,密钥为'key',加密后的串保存于@pass中。SET @pass=AES_ENCRYPT('hello world', 'key','1111111111111111');
Query OK, 0 rows affected (0.001 sec -
查看加密后串的长度(都为 2 的整数次方)。
SELECT CHAR_LENGTH(@pass);
+--------------------+
| CHAR_LENGTH(@pass) |
+--------------------+
| 16 |
+--------------------+
1 row in set (0.001 sec) -
使用
AES_DECRYPT()解密。SELECT AES_DECRYPT(@pass, 'key');
ERROR 1582 (42000): Incorrect parameter count
SELECT AES_DECRYPT(@pass, 'key','1111111111111111');
+----------------------------------------------+
| AES_DECRYPT(@pass, 'key','1111111111111111') |
+----------------------------------------------+
| hello world |
+----------------------------------------------+
1 row in set (0.001 sec)