注册
适配MySQL AES_DECRYPT解密
技术分享/ 文章详情 /

适配MySQL AES_DECRYPT解密

Live 2025/02/21 228 0 0

问题描述

mysql的AES_DECRYPT的解密函数使用例子如下,DM数据库有AES加密解密函数么?

SELECT HEX(AES_ENCRYPT('623125196001236656', 'abcd@123'));

image20250214145431638.png

select AES_DECRYPT(UNHEX('1269A376307F28F5EEA3FEBA64F34F56D39E164654948179591AD081316916D4'),'abcd@123');

image20250214145453740.png

MySQL AES_DECRYPT和AES_ENCRYPT介绍

先来看一下mysql的加密和解密介绍。这里因为只有部分参数使用到,其它参数作忽略处理。

以下是官方文档翻译摘抄:

AES_DECRYPT(crypt_str, key_str [,init_vector] [,kdf_name] [,salt] [,info | iterations])]

此函数使用官方的 AES(高级加密标准)算法解密数据。有关更多信息,请参阅 AES_ENCRYPT() 的描述。

使用 AES_DECRYPT() 的语句对于基于语句的复制来说是不安全的。


AES_ENCRYPT(str, key_str [,init_vector] [,kdf_name] [,salt] [,info | iterations])]

AES_ENCRYPT()AES_DECRYPT() 使用官方的 AES(高级加密标准)算法(以前称为“Rijndael”)对数据进行加密和解密。AES 标准支持多种密钥长度。默认情况下,这些函数实现的是 128 位密钥长度的 AES。还可以使用 196 位或 256 位的密钥长度,具体如下。密钥长度在性能和安全性之间需要做权衡。

AES_ENCRYPT() 使用密钥字符串 key_str 对字符串 str 进行加密,并返回包含加密输出的二进制字符串。AES_DECRYPT() 使用密钥字符串 key_str 对加密字符串 crypt_str 进行解密,并返回原始的(二进制)字符串,结果以十六进制格式显示。如果任一函数参数为 NULL,则该函数返回 NULL。如果 AES_DECRYPT() 检测到无效数据或错误的填充,它将返回 NULL。然而,如果输入数据或密钥无效,AES_DECRYPT() 可能会返回非 NULL 的值(可能是垃圾数据)。

DM 系统包 DBMS_CRYPTO

DBMS_CRYPTO 包提供加密和解密数据的接口,支持几种工业标准的分组加密、流加密算法和散列算法。分组加密算法包括 ADVANCED ENCRYPTION STANDARD(AES)、 DATA ENCRYPTION STANDARD(DES);流加密算法包括 RC4;散列算法包括 MD5、 SHA-1、SHA-256、 SHA-384、 SHA-512。

适配改写

select unhex(DBMS_CRYPTO.DECRYPT('1269A376307F28F5EEA3FEBA64F34F56D39E164654948179591AD081316916D4', DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5, hex(RPAD('abcd@123', 16, CHR(0))))); select DBMS_CRYPTO.ENCRYPT(HEX('623125196001236656'), DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5, hex(RPAD('abcd@123', 16, CHR(0)))) ;

因加密密钥的长度必须足够,这里KEY做了补0处理。

函数封装

当解密失败时,DM数据库直接报错,Mysql会返回NULL。这里我们使用函数做封装处理。

CREATE OR REPLACE FUNCTION AES_DECRYPT (V_STR VARCHAR2, V_KEY VARCHAR2) RETURN VARCHAR2 AS V_RETURN_STR VARCHAR2 (2000); BEGIN V_RETURN_STR := unhex(DBMS_CRYPTO.DECRYPT(V_STR, DBMS_CRYPTO.ENCRYPT_AES128+DBMS_CRYPTO.CHAIN_ECB+DBMS_CRYPTO.PAD_PKCS5,hex(RPAD(V_KEY, 16, CHR(0))))); RETURN V_RETURN_STR; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('解密失败,返回 NULL'); RETURN NULL; END; SELECT AES_DECRYPT('1269A376307F28F5EEA3FEBA64F34F56D39E164654948179591AD081316916D4', 'abcd@123'); SELECT AES_DECRYPT('52E3400353662D37A126DD9DF95C0902D1884', 'abcd@123'); SELECT AES_DECRYPT('3303234957****0122', 'abcd@123');

测试效果如下。
image20250214151600916.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服