跳到主要内容

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 库是否需要初始化向量
    ECBOpenSSL
    CBCOpenSSL
    CFB1OpenSSL
    CFB8OpenSSL
    CFB128OpenSSL
    OFBOpenSSL

示例

  • '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)