Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


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

    sql
    FUNCTION Encrypt(
        src         IN RAW,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    ) RETURN RAW;
  • 重载形式二:明文串src类型为VARCHAR

    sql
    FUNCTION Encrypt(
        src         IN VARCHAR,
        typ         IN INTEGER,
        key         IN VARCHAR,
        iv          IN VARCHAR DEFAULT NULL
    ) RETURN RAW;
  • 重载形式三:明文串src类型为BLOB对象

    sql
    PROCEDURE Encrypt(
        dst         IN OUT BLOB,
        src         IN BLOB,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    );
  • 重载形式四:明文串src类型为CLOB对象

    sql
    PROCEDURE Encrypt(
        dst         IN OUT BLOB,
        src         IN CLOB,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    );

2.3 参数说明

参数名类型取值范围是否可选描述
dstBLOB用于存储返回值
srcRAW/VARCHAR/BLOB/CLOB明文串
typINTEGER密码套件设置,指定加密模式、工作模式和填充模式
keyRAW密钥串
ivRAW是,默认为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数据

    sql
    FUNCTION Decrypt(
        src         IN RAW,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    ) RETURN RAW;
  • 重载形式二:对RAW数据解密,返回VARCHAR数据

    sql
    FUNCTION Decrypt(
        src         IN RAW,
        typ         IN INTEGER,
        key         IN VARCHAR,
        iv          IN VARCHAR DEFAULT NULL
    ) RETURN VARCHAR;
  • 重载形式三:对BLOB数据解密,返回BLOB数据

    sql
    PROCEDURE Decrypt(
        dst         IN OUT BLOB,
        src         IN BLOB,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    );
  • 重载形式四:对BLOB数据解密,返回CLOB数据

    sql
    PROCEDURE Decrypt(
        dst         IN OUT CLOB,
        src         IN BLOB,
        typ         IN INTEGER,
        key         IN RAW,
        iv          IN RAW DEFAULT NULL
    );

3.3 参数说明

参数名类型取值范围是否可选描述
dstRAW/VARCHAR/BLOB/CLOB用于存储返回值
srcRAW/BLOB密文串
typINTEGER密码套件设置,指定加密模式、工作模式和填充模式
keyRAW/VARCHAR密钥串
ivRAW/VARCHAR是,默认为NULLIV
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值

    sql
    FUNCTION Hash(
        src         IN RAW,
        typ         IN INTEGER
    ) RETURN RAW;
  • 重载形式二:对BLOB数据计算HASH值

    sql
    FUNCTION Hash(
        src         IN BLOB,
        typ         IN INTEGER
    ) RETURN RAW;
  • 重载形式三:对CLOB数据计算HASH值

    sql
    FUNCTION Hash(
        src         IN CLOB,
        typ         IN INTEGER
    ) RETURN RAW;

4.3 参数说明

参数名类型取值范围是否可选描述
srcRAW/BLOB/CLOB源数据
typINTEGER密码套件设置
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值

    sql
    FUNCTION Mac(
      src         IN RAW,
      typ         IN INTEGER,
      key         IN RAW
    ) RETURN RAW;
  • 重载形式二:对BLOB数据计算HMAC值

    sql
    FUNCTION Mac(
      src         IN BLOB,
      typ         IN INTEGER,
      key         IN RAW
    ) RETURN RAW;
  • 重载形式三:对CLOB数据计算HMAC值

    sql
    FUNCTION Mac(
      src         IN CLOB,
      typ         IN INTEGER,
      key         IN RAW
    ) RETURN RAW;

5.3 参数说明

参数名类型取值范围是否可选描述
srcRAW/BLOB/CLOB源数据
typINTEGER密码套件设置
keyRAW密钥串
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_bytesINTEGER[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 场景应用

  • 场景一:某些表存在触发器,生成随机数进行测试