DBMS_CRYPTO系统包
📄字数 6.5K
👁️阅读量 加载中...
一、概述
DBMS_CRYPTO系统包是一个加密安全系统包,用于在PL/SQL中实现各种数据安全操作,包括加密(Encrypt)、解密(Decrypt)、哈希摘要(Hash)、消息认证(MAC)、生成随机数/随机字节。它是虚谷数据库内部实现数据安全控制、信息防篡改和加密传输的关键工具之一。
在该系统包中提供了以下接口:
包体函数名 | 简要描述 |
---|---|
ENCRYPT | 加密数据 |
DECRYPT | 解密数据 |
HASH | 生成数据的HASH值 |
MAC | 生成数据的HMAC值 |
RANDOMBYTES | 生成指定长度的随机字节 |
RANDOMINTEGER | 生成随机的INTEGER数据 |
RANDOMNUMBER | 生成随机的NUMBER数据 |
典型应用场景,如:
- 组合使用ENCRYPT和DECRYPT,完成加密用户敏感信息,如身份证、密码
- 使用HASH进行数据完整性校验,如传输验证
- 使用MAC实现防篡改接口,如带密钥的哈希校验
- 使用RANDOMBYTES等生成随机令牌、验证码、密钥
二、ENCRYPT
2.1 功能描述
该接口可用于加密RAW或VARCHAR类型数据,返回RAW类型加密数据;以及加密BLOB或CLOB类型数据,返回BLOB类型加密数据
2.2 方法声明
该方法有多种重载方式,其对应对不同数据类型的数据进行加密
重载形式一:明文串src类型为RAW
sqlFUNCTION Encrypt( src IN RAW, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL ) RETURN RAW;
重载形式二:明文串src类型为VARCHAR
sqlFUNCTION Encrypt( src IN VARCHAR, typ IN INTEGER, key IN VARCHAR, iv IN VARCHAR DEFAULT NULL ) RETURN RAW;
重载形式三:明文串src类型为BLOB对象
sqlPROCEDURE Encrypt( dst IN OUT BLOB, src IN BLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL );
重载形式四:明文串src类型为CLOB对象
sqlPROCEDURE Encrypt( dst IN OUT BLOB, src IN CLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL );
2.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
dst | BLOB | 无 | 否 | 用于存储返回值 |
src | RAW/VARCHAR/BLOB/CLOB | 无 | 否 | 明文串 |
typ | INTEGER | 无 | 否 | 密码套件设置,指定加密模式、工作模式和填充模式 |
key | RAW | 无 | 否 | 密钥串 |
iv | RAW | 无 | 是,默认为NULL | 初始化向量 |
sql
-- 常用的密码套件设置包括:
DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
提示
1、密钥串不能为NULL
2、当明文串src类型为BLOB/CLOB对象时,dst参数不能为NULL
2.4 示例
- 加密VARCHAR类型数据
sql
SQL> DECLARE
src VARCHAR := 'abcdefghijklmnopqrstuvwxyz';
typ INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
key VARCHAR := '这是密钥串';
enc_bin RAW;
BEGIN
enc_bin:=DBMS_CRYPTO.ENCRYPT(src,typ,key); -- 加密
SEND_MSG(enc_bin); -- 打印结果
END;
/
-- 输出结果
2A88FD5147C8C37E377797DE978B4AA7A097DDE89C54611D3837125D1EF62C97
- 加密BLOB类型数据
sql
SQL> DECLARE
dst BLOB := UTL_RAW.CAST_TO_RAW('100');
src BLOB := UTL_RAW.CAST_TO_RAW('1');
typ INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
key VARCHAR := 'abcabcabcabc';
iv VARCHAR := 'abcdef0123456789';
BEGIN
DBMS_CRYPTO.ENCRYPT(dst,src,typ,key,iv);
SEND_MSG(RAWTOHEX(dst));
END;
/
-- 输出结果
F9E351373FD04CD3049CDBBCE0DDE606
2.5 场景应用
- 场景一:数据库中保存了API密钥、配置参数、用户Token等信息,使用加密函数对这些字段加密,防止明文泄漏
- 场景二:行业合规要求中要求对敏感字段加密存储
三、DECRYPT
3.1 功能描述
该接口可用于解密RAW类型数据,并返回RAW类型数据或VARCHAR类型数据;也可以解密BLOB类型数据,返回BLOB类型数据或CLOB类型数据
3.2 方法声明
该方法有多种重载方式,对应对不同数据类型的数据进行解密以及返回不同数据类型的数据
重载形式一:对RAW数据解密,返回RAW数据
sqlFUNCTION Decrypt( src IN RAW, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL ) RETURN RAW;
重载形式二:对RAW数据解密,返回VARCHAR数据
sqlFUNCTION Decrypt( src IN RAW, typ IN INTEGER, key IN VARCHAR, iv IN VARCHAR DEFAULT NULL ) RETURN VARCHAR;
重载形式三:对BLOB数据解密,返回BLOB数据
sqlPROCEDURE Decrypt( dst IN OUT BLOB, src IN BLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL );
重载形式四:对BLOB数据解密,返回CLOB数据
sqlPROCEDURE Decrypt( dst IN OUT CLOB, src IN BLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL );
3.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
dst | RAW/VARCHAR/BLOB/CLOB | 无 | 否 | 用于存储返回值 |
src | RAW/BLOB | 无 | 否 | 密文串 |
typ | INTEGER | 无 | 否 | 密码套件设置,指定加密模式、工作模式和填充模式 |
key | RAW/VARCHAR | 无 | 否 | 密钥串 |
iv | RAW/VARCHAR | 无 | 是,默认为NULL | IV |
sql
-- 常用的密码套件设置包括:
DEC_CBC_PKCS5 INTEGET := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
DEC3_CBC_PKCS5 INTEGET := DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
AES_CBC_PKCS5 INTEGET := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
提示
1、密钥串不能为NULL
2、当密文串src类型为BLOB对象时,dst参数不能为NULL
3.4 示例
- 解密RAW类型数据
sql
SQL> DECLARE
typ INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
key VARCHAR := '这是key';
msg VARCHAR;
src VARCHAR := 'abcdefghijklmnopqrstuvwxyz';
enc_bin RAW;
BEGIN
enc_bin := DBMS_CRYPTO.ENCRYPT(src,typ,key); -- 加密
msg := DBMS_CRYPTO.DECRYPT(enc_bin,typ,key); -- 解密
SEND_MSG(msg);
END;
/
-- 输出结果
abcdefghijklmnopqrstuvwxyz
- 解密BLOB类型数据
sql
SQL> DECLARE
typ INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
enc_dst BLOB := UTL_RAW.CAST_TO_RAW('1'); -- 用于保存加密结果
dec_dst BLOB := UTL_RAW.CAST_TO_RAW('1'); -- 用于保存解密结果
src BLOB := UTL_RAW.CAST_TO_RAW('1'); -- 原始数据
key VARCHAR := 'abcabcabcabc'; -- 密钥串
iv VARCHAR := 'abcdef0123456789'; -- IV
BEGIN
DBMS_CRYPTO.ENCRYPT(enc_dst,src,typ,key,iv); -- 加密
SEND_MSG(RAWTOHEX(enc_dst));
DBMS_CRYPTO.DECRYPT(dec_dst,enc_dst,typ,key,iv); -- 解密
SEND_MSG(UTL_RAW.CAST_TO_VARCHAR2(dec_dst));
END;
/
-- 输出结果
F9E351373FD04CD3049CDBBCE0DDE606 -- 加密结果
1 -- 解密结果
3.5 场景应用
- 场景一:某些系统异常或故障后,需读取加密存储的数据排查问题
- 场景二:对于合规检查或监管机构的数据审计请求,对加密字段如用户日志、交易记录等进行解密,提供可读性证据
四、HASH
4.1 功能描述
该接口可用于计算数据的HASH值。数据类型支持RAW、BLOB、CLOB。计算数据的HASH值是数据完整性验证、签名校验、防篡改、身份确认的重要手段
4.2 方法声明
该方法有多种重载方式,其对应对不同的数据类型计算HASH值
重载形式一:对RAW数据计算HASH值
sqlFUNCTION Hash( src IN RAW, typ IN INTEGER ) RETURN RAW;
重载形式二:对BLOB数据计算HASH值
sqlFUNCTION Hash( src IN BLOB, typ IN INTEGER ) RETURN RAW;
重载形式三:对CLOB数据计算HASH值
sqlFUNCTION Hash( src IN CLOB, typ IN INTEGER ) RETURN RAW;
4.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
src | RAW/BLOB/CLOB | 无 | 否 | 源数据 |
typ | INTEGER | 无 | 否 | 密码套件设置 |
sql
-- 常用的密码套件设置包括:
HASH_MD4 INTEGER := 1;
HASH_MD5 INTEGER := 2;
HASH_SH1 INTEGER := 3;
HASH_SHA224 INTEGER := 4;
HASH_SHA256 INTEGER := 5;
HASH_SHA384 INTEGER := 6;
HASH_SHA512 INTEGER := 7;
4.4 示例
- PL/SQL语句
sql
-- 分别计算BLOB、CLOB、RAW源数据的HASH值,并返回RAW数据类型
SQL> DECLARE
typ INTEGER := DBMS_CRYPTO.HASH_MD5;
src1 BLOB := UTL_RAW.CAST_TO_RAW('1');
src2 CLOB := '123456';
src3 RAW := UTL_RAW.CAST_TO_RAW('1');
result RAW;
BEGIN
result := DBMS_CRYPTO.HASH(src1,typ);
SEND_MSG(RAWTOHEX(result));
result := DBMS_CRYPTO.HASH(src2,typ);
SEND_MSG(RAWTOHEX(result));
result := DBMS_CRYPTO.HASH(src3,typ);
SEND_MSG(RAWTOHEX(result));
END;
/
-- 输出结果
C4CA4238A0B923820DCC509A6F75849B
E10ADC3949BA59ABBE56E057F20F883E
C4CA4238A0B923820DCC509A6F75849B
- 直接使用SELECT语句。
sql
SQL> SELECT RAWTOHEX(DBMS_CRYPTO.HASH('123456',1)); -- 1表示HASH_MD4算法
+----------------------------------+
| EXPR1 |
+----------------------------------+
| 585028AA0F794AF812EE3BE8804EB14A |
+----------------------------------+
4.5 场景应用
- 场景一:对数据计算HASH值,对比是否一致,校验数据完整性
- 场景二:定期计算敏感字段HASH值,监控是否被修改
五、MAC
5.1 功能描述
该接口可用于计算数据的HMAC值。数据类型支持RAW、BLOB、CLOB。与普通HASH不同,HMAC值不仅能检测数据是否被篡改,还能验证数据来源是否可信
5.2 方法声明
该方法有多种重载方式,其对应对不同的数据类型进行HMAC值计算
重载形式一:对RAW数据计算HMAC值
sqlFUNCTION Mac( src IN RAW, typ IN INTEGER, key IN RAW ) RETURN RAW;
重载形式二:对BLOB数据计算HMAC值
sqlFUNCTION Mac( src IN BLOB, typ IN INTEGER, key IN RAW ) RETURN RAW;
重载形式三:对CLOB数据计算HMAC值
sqlFUNCTION Mac( src IN CLOB, typ IN INTEGER, key IN RAW ) RETURN RAW;
5.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
src | RAW/BLOB/CLOB | 无 | 否 | 源数据 |
typ | INTEGER | 无 | 否 | 密码套件设置 |
key | RAW | 无 | 否 | 密钥串 |
sql
-- 常用的密码套件设置包括:
HAMC_MD5 INTEGER := 1;
HAMC_SH1 INTEGER := 2;
5.4 示例
- PL/SQL语句
sql
-- 分别计算BLOB、CLOB、RAW源数据的HMAC值,并返回RAW数据类型
SQL> DECLARE
typ INTEGER := DBMS_CRYPTO.HMAC_MD5;
src1 BLOB := UTL_RAW.CAST_TO_RAW('1');
src2 CLOB := '123456';
src3 RAW := UTL_RAW.CAST_TO_RAW('1');
key RAW := UTL_RAW.CAST_TO_RAW('0123456789abcdef');
result RAW;
BEGIN
result := DBMS_CRYPTO.MAC(src1,typ,key);
SEND_MSG(RAWTOHEX(result));
result := DBMS_CRYPTO.MAC(src2,typ,key);
SEND_MSG(RAWTOHEX(result));
result := DBMS_CRYPTO.MAC(src3,typ,key);
SEND_MSG(RAWTOHEX(result));
END;
/
-- 输出结果
CF428B0404CB8D21C4D52F957FB22A5C
E69AD24D696D19AA2D49AEA43161B4F6
CF428B0404CB8D21C4D52F957FB22A5C
- 直接使用SELECT语句
sql
SQL> SELECT RAWTOHEX(DBMS_CRYPTO.MAC('123456', 1, UTL_RAW.CAST_TO_RAW('0123456789abcdef')));
+----------------------------------+
| EXPR1 |
+----------------------------------+
| E69AD24D696D19AA2D49AEA43161B4F6 |
+----------------------------------+
5.5 场景应用
- 场景一:对系统配置表的配置字段+密钥计算HMAC值,定期监控,防止被恶意篡改
- 场景二:对每份文档计算HMAC并存储,对访问数据进行验证
六、RANDOMBYTES
6.1 功能描述
该接口用于生成指定长度的随机字节
6.2 方法声明
sql
FUNCTION RandomBytes(
number_bytes IN INTEGER
) RETURN RAW;
6.3 参数说明
参数名 | 类型 | 取值范围 | 是否可选 | 描述 |
---|---|---|---|---|
number_bytes | INTEGER | [1,1024] | 否 | 用于指定字节数大小 |
6.4 示例
sql
-- 生成10字节大小的随机字节
SQL> SELECT RAWTOHEX(DBMS_CRYPTO.RANDOMBYTES(10));
+----------------------+
| EXPR1 |
+----------------------+
| F19A0F870E82E1EE071D |
+----------------------+
6.5 场景应用
- 场景一:测试数据库中需要构造真实结构但非真实内容的数据,生成随机字节后编码为字符字段,模拟真实业务数据量
七、RANDOMINTEGER
7.1 功能描述
该接口用于生成随机的INTEGER数据
7.2 方法声明
sql
FUNCTION RANDOMINTEGER RETURN INTEGER;
7.3 示例
sql
-- 生成一个随机的INTEGER数据
SQL> SELECT DBMS_CRYPTO.RANDOMINTEGER;
+------------+
| EXPR1 |
+------------+
| 2057951472 |
+------------+
7.4 场景应用
- 场景一:在某些压力测试、sql调优、分区/索引验证中需要大量数据,构造随机INTEGER数据
八、RANDOMNUMBER
8.1 功能描述
该接口用于生成随机的NUMBER数据
8.2 方法声明
sql
FUNCTION RANDOMNUMBER RETURN NUMBER;
8.3 示例
sql
-- 生成一个随机的NUMBER数据
SQL> SELECT DBMS_CRYPTO.RANDOMNUMBER;
+--------------------------------------+
| EXPR1 |
+--------------------------------------+
| 532106935801933376363545084236858961 |
+--------------------------------------+
8.4 场景应用
- 场景一:某些表存在触发器,生成随机数进行测试