Skip to content

适用虚谷数据库版本

v12.10.13



适用虚谷数据库版本

v12.10.13


AES_ENCRYPT

📄字数 1.7K
👁️阅读量 加载中...

功能描述

使用 AES(Advanced Encryption Standard) 算法对输入数据进行加密,支持指定加密模式、初始化向量(IV)及密钥派生函数(如 HKDF、PBKDF2_HMAC)。

提示

  • MySQLAES_ENCRYPT 函数相比,本函数的加密模式(如 aes-128-ecb)通过第三个参数直接指定,而非依赖系统变量,密钥派生相关参数(盐值、迭代次数等)需显式传入。
  • 最小参数为 2 个(待加密数据和原始密钥),此时加密模式默认使用 aes-128-ecb

语法格式

sql
AES_ENCRYPT(str, key_str[, mode][, iv][, kdf][, kdf_param1][, kdf_param2])

输入参数

  • str:待加密的原始数据,支持 VARCHAR 类型或隐式转换为 VARCHAR 类型的值。
  • key_str:用于派生或直接作为加密的原始密钥。VARCHAR 类型。
  • mode:加密模式,支持 aes-128/192/256-ecb/cbc/ofb/cfb,默认值为 aes-128-ecbVARCHAR 类型。
  • iv:初始化向量,长度需与加密模式匹配(如 aes-128-cbc 需 16 字节 IV)。ECB 模式无需 IV,可省略。VARCHAR 类型。
  • kdf:密钥派生函数,支持 hkdf(基于 HMAC 的密钥派生)、pbkdf2_hmac(基于密码的密钥派生)。VARCHAR 类型。
  • kdf_param1:密钥派生函数的第一个参数,VARCHAR 类型:
    • kdf=hkdf:表示盐值(可选,默认空);
    • kdf=pbkdf2_hmac:表示盐值(可选,默认空)。
  • kdf_param2:密钥派生函数的第二个参数,VARCHAR 类型:
    • kdf=hkdf:表示上下文信息(可选,默认空);
    • kdf=pbkdf2_hmac:表示迭代次数(正整数,可选,默认 1000 )。

提示

  • 当使用非标准长度密钥时(即密钥长度超过 AES 规范要求:AES-128 为 16 字节、AES-192 为 24 字节、AES-256 为 32 字节),aes_encrypt 函数不会直接使用原始密钥。当使用小于标准密钥长度的密钥时,该函数会直接使用原始密钥,与MySQL一致。
  • 该函数会采用与 MySQL 一致的处理方式:通过循环遍历 + 按位异或(XOR)折叠的算法,将任意长度的输入密钥压缩为固定长度的 AES 密钥,从而保证加密结果与 MySQL 行为保持一致。
  • 需要特别注意的是,这种密钥处理方式与 DBMS_CRYPTO 的实现存在差异:在 DBMS_CRYPTO 中,当密钥长度超过 AES 标准长度时,会直接截断,仅使用前 N 字节(N 为对应 AES 模式的密钥长度),而不会进行 XOR 折叠处理。
  • 此外,该密钥处理方式并非标准的密钥派生函数(KDF),其基于简单的 XOR 折叠实现,可能导致密钥信息熵降低及碰撞风险。在对安全性要求较高的场景中,建议优先结合标准 KDF(如 PBKDF2、HKDF)对密钥进行预处理。

输出结果

  • 类型:VARCHAR(二进制数据)。若任意必选参数为 NULL,返回 NULL;否则返回加密后的二进制数据。

执行类型

TYPEVALUE说明
NATIVE0函数只能在本地计算
VOLATI0函数的每次计算值不同
STABLE0函数的每次计算值相同
COMPUTE0函数支持预计算取值
NOT_CONST0函数不支持转常数
HAVE_DEF0函数参数有默认值

示例

sql
示例1:
-- 使用默认的 aes-128-ecb 模式,直接用 key_str 作为密钥:
SELECT HEX(AES_ENCRYPT('test', 'secret_key')) FROM dual;

+----------------------------------+
|            EXPR1                 |
+----------------------------------+
| 50E009FBB13B4E324292E01BFE0F7FAF |  
+----------------------------------+

示例2:
-- 使用 hkdf 派生密钥,配合 aes-128-ecb 模式:
SQL> SELECT HEX(AES_ENCRYPT('test', 'key', 'aes-128-ecb', '0123456789123456', 'hkdf', 'salt123', 'info456')) FROM dual;

+----------------------------------+
|            EXPR1                 |
+----------------------------------+
| 43C95D4B524DF410CB0024EBCC54C250 |  
+----------------------------------+

示例3:
-- 使用aes-128-ecb模式+PBKDF2_HMAC密钥派生
SQL> SELECT HEX(AES_ENCRYPT('test', 'key', 'aes-128-ecb', '0123456789123456', 'pbkdf2_hmac', 'salt123', 10000)) FROM dual;

+----------------------------------+
|            EXPR1                 |
+----------------------------------+
| F9AEEE1B566860CA30E1EC087CDD8B07 |  
+----------------------------------+