AES_DECRYPT
📄字数 2.0K
👁️阅读量 加载中...
功能描述
使用 AES(Advanced Encryption Standard) 算法对加密数据进行解密,支持与加密时对应的加密模式、初始化向量(IV)及密钥派生函数(如 HKDF、PBKDF2_HMAC),需与 AES_ENCRYPT 函数的加密参数完全匹配才能正确解密。
提示
- 与
MySQL的AES_DECRYPT函数相比,本函数的解密模式(如aes-128-ecb)通过参数直接指定,而非依赖系统变量,且需显式传入与加密时一致的密钥派生参数(盐值、迭代次数等)。 - 最小参数为
2个(待解密数据和原始密钥),此时解密模式默认使用aes-128-ecb(需与加密时模式一致)。
语法格式
sql
AES_DECRYPT(cipher_str, key_str[, mode][, iv][, kdf][, kdf_param1][, kdf_param2])输入参数
cipher_str:待解密的加密数据(通常为 AES_ENCRYPT 的输出结果,或其十六进制形式经 UNHEX 转换后的值),支持VARCHAR类型或能隐式转换为VARCHAR类型的值。key_str: 与加密时一致的原始密钥(用于派生或直接作为解密密钥)。VARCHAR类型。mode:解密模式,需与加密时完全一致,支持aes-128/192/256-ecb/cbc/ofb/cfb,默认值为aes-128-ecb。VARCHAR类型。iv:初始化向量,需与加密时完全一致(长度和值均匹配)。ECB模式无需 IV,可省略。VARCHAR类型。kdf:密钥派生函数,需与加密时完全一致,支持hkdf、pbkdf2_hmac。VARCHAR类型。kdf_param1:密钥派生函数的第一个参数,需与加密时完全一致;VARCHAR类型:- 若
kdf=hkdf:表示盐值(与加密时的盐值相同); - 若
kdf=pbkdf2_hmac:表示盐值(与加密时的盐值相同)。
- 若
kdf_param2:密钥派生函数的第二个参数,需与加密时完全一致;VARCHAR类型。:- 若
kdf=hkdf:表示上下文信息(与加密时的信息相同); - 若
kdf=pbkdf2_hmac:表示迭代次数(与加密时的次数相同,正整数)。
- 若
注意
提示
- 当使用非标准长度密钥时(即密钥长度超过 AES 规范要求:AES-128 为 16 字节、AES-192 为 24 字节、AES-256 为 32 字节),
aes_decrypt函数不会直接使用原始密钥。当使用小于标准密钥长度的密钥时,该函数会直接使用原始密钥,与MySQL一致。 - 该函数会采用与 MySQL 一致的处理方式:通过循环遍历 + 按位异或(XOR)折叠的算法,将任意长度的输入密钥压缩为固定长度的 AES 密钥,从而保证解密结果与 MySQL 行为保持一致。
- 需要特别注意的是,这种密钥处理方式与 DBMS_CRYPTO 的实现存在差异:在
DBMS_CRYPTO中,当密钥长度超过 AES 标准长度时,会直接截断,仅使用前 N 字节(N 为对应 AES 模式的密钥长度),而不会进行 XOR 折叠处理。 - 此外,该密钥处理方式并非标准的密钥派生函数(KDF),其基于简单的 XOR 折叠实现,可能导致密钥信息熵降低及碰撞风险。在对安全性要求较高的场景中,建议优先结合标准 KDF(如 PBKDF2、HKDF)对密钥进行预处理。
输出结果
- 类型:
VARCHAR(原始明文数据),若任意必选参数为NULL,返回NULL;否则返回解密后的原始明文数据。
执行类型
| TYPE | VALUE | 说明 |
|---|---|---|
| NATIVE | 0 | 函数只能在本地计算 |
| VOLATI | 0 | 函数的每次计算值不同 |
| STABLE | 0 | 函数的每次计算值相同 |
| COMPUTE | 0 | 函数支持预计算取值 |
| NOT_CONST | 0 | 函数不支持转常数 |
| HAVE_DEF | 0 | 函数参数有默认值 |
示例
sql
示例1:
-- 基础解密
SELECT AES_DECRYPT(UNHEX('50E009FBB13B4E324292E01BFE0F7FAF'), 'secret_key') FROM dual;
+----------------------------------+
| EXPR1 |
+----------------------------------+
| test |
+----------------------------------+
示例2:
-- HKDF密钥派生解密
SELECT AES_DECRYPT(UNHEX('43C95D4B524DF410CB0024EBCC54C250'), 'key', 'aes-128-ecb', '0123456789123456', 'hkdf', 'salt123', 'info456') FROM dual;
+----------------------------------+
| EXPR1 |
+----------------------------------+
| test |
+----------------------------------+
示例3:
-- 使用与加密时一致的 `pbkdf2_hmac` 派生参数:
SELECT AES_DECRYPT(UNHEX('F9AEEE1B566860CA30E1EC087CDD8B07'), 'key', 'aes-128-ecb', '0123456789123456', 'pbkdf2_hmac', 'salt123', 10000) FROM dual;
+----------------------------------+
| EXPR1 |
+----------------------------------+
| test |
+----------------------------------+