VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DBMS_CRYPTO

功能描述

DBMS_CRYPTO是一个PL/SQL包,提供用于加密和解密存储的数据的接口,可以对常用的数据类型进行加密和解密,比如raw和大对象clob,blob类型。

  • raw类型:存储二进制数据或位串。
  • blob类型:存储二进制大对象数据(如数码照片)。
  • clob类型:存储大对象单字节的字符数据(如大型文本)。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

  • 使用DBMS_CRYPTO内置包前,需要先加载pgcrypto插件。执行如下命令加载插件:

    CREATE EXTENSION pgcrypto;
    
  • ENCRYPT函数和DECRYPT函数支持的加密套件组合码如下表:

    加密套件标识符 整数码
    encrypt_des 1
    encrypt_3des 3
    chain_ecb 768
    chain_cbc 256
    pad_pkcs 4096
    pad_none 8192
    des_cbc_pkcs 4353
    des3_cbc_pkcs 4355
    hash_md5 2
    hmac_md5 1
  • 使用加密函数时使用标识符名称会报错,必须使用对应的整数码。

    例如,下面语句中使用标识符名称语句执行失败。

    select dbms_crypto.decrypt('57E647BDA301C9FA'::raw, dbms_crypto.des_cbc_pkcs, '123456'::raw);
    

    将dbms_crypto.des_cbc_pkcs名称换成4353后语句执行成功。

    select dbms_crypto.decrypt('57E647BDA301C9FA'::raw, 4353, '123456'::raw);
    
  • 对于使用两种或以上加密套件标识符的情况,只需要将其整数码数值相加即可。

子程序

该内置包包含以下函数,其中ENCRYPT、DECRYPT函数均存在两个,下面描述时记作ENCRYPT函数1、ENCRYPT函数2、DECRYPT函数1、DECRYPT函数2。

函数 描述
ENCRYPT函数1 使用用户指定的加密套件来对raw类型数据进行加密,返回raw类型数据。
ENCRYPT函数2 使用用户指定的加密套件来对blob、clob类型数据进行加密,返回blob类型数据。
DECRYPT函数1 使用用户指定的加密套件来对raw类型数据进行解密。
DECRYPT函数2 使用用户指定的加密套件来对blob类型数据进行解密。
HASH函数 使用用户指定的hash算法来返回一个raw类型的哈希值,使用哈希值来验证数据是否已更改。算法标识符是hash_md5,整数码为2。
MAC函数 使用用户指定的MAC算法来返回一个bytea类型数据的MAC哈希值。算法标识符是hmac_md5,整数码为1。
RANDOM_BYTES函数 生成指定长度(范围为[1, 2000])的随机字节raw值。
RANDOM_INTEGER函数 用于返回integer数据类型的完整范围内的随机整数。
RANDOM_NUMBER函数 用于返回number数据类型范围为[0, 2^128 - 1]内的随机数据。

ENCRYPT函数1

语法格式

DBMS_CRYPTO.ENCRYPT(
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv  IN RAW          DEFAULT NULL)
 RETURN RAW;

参数说明

  • src:要破解的RAW数据。
  • typ:加密类型。
  • key:解密使用的key。
  • iv:块密码初始化向量,缺省NULL。

示例

  • 直接调用。

    select dbms_crypto.encrypt('ABCABC'::raw, 4353, '123456'::raw);
    select dbms_crypto.decrypt('57E647BDA301C9FA'::raw, 4353,'123456'::raw);
    

    返回结果依次为:

      encrypt      
    ------------------
    57E647BDA301C9FA
    (1 row)
    
    decrypt 
    ---------
    ABCABC
    (1 row)
    
  • 加密表数据。

    1、创建测试表并插入数据。

    create table t_select_raw(id int, col varchar2(20));
    insert into t_select_raw values(1,'测试');
    insert into t_select_raw values(2,'中文');
    
    create table t_dml_raw(id int, col raw);
    insert into t_dml_raw values(1,'1234AABBCCDDEEFF');
    

    2、查询结果加密。

    select dbms_crypto.encrypt(hextoraw(encode(col::bytea, 'hex')), 4353, '123456'::raw) from t_select_raw;
    select dbms_crypto.encrypt(hextoraw(encode(col::bytea, 'hex')), 4353, hextoraw(encode(col::bytea, 'hex'))) from t_select_raw;
    select dbms_crypto.encrypt(hextoraw(encode(col::bytea, 'hex')), 4353, hextoraw(encode(col::bytea, 'hex')),  hextoraw(encode(col::bytea, 'hex'))) from t_select_raw;
    

    返回结果f分别如下所示:

      encrypt      
    ------------------
    6C5B52D18B146E13
    B01C554C5102A8FE
    (2 rows)
    
      encrypt      
    ------------------
    9A5296006CB243A3
    3D172C9ECA9B4A43
    (2 rows)
    
      encrypt      
    ------------------
    58AEFBB87999E13C
    CE070EDF29322C9F
    (2 rows)
    

    3、查询raw数据。

      select dbms_crypto.encrypt(col, 4353, col,col) from t_dml_raw;
    

    返回结果为:

               encrypt              
    ----------------------------------
    8475EECF02BEE7E870B363D667785B6E
    (1 row)
    

    4、插入数据加密。

    insert into t_dml_raw values(2, dbms_crypto.encrypt(hextoraw(encode('中文'::bytea, 'hex')), 4353, '1'::raw));
    insert into t_dml_raw values(2, dbms_crypto.encrypt(hextoraw(encode('abc'::bytea, 'hex')), 4353, hextoraw(encode('2'::bytea, 'hex')), hextoraw(encode('2'::bytea, 'hex'))));
    update t_dml_raw set col = dbms_crypto.encrypt(hextoraw(encode('测试'::bytea, 'hex')), 4353, '1'::raw) where id = 1;
    

    5、显示加密后的结果。

    select * from t_dml_raw;
    

    返回结果为:

    id |       col        
    ----+------------------
    2 | 634FE089F003C8AA
    2 | 10759AD6661DD7BC
    1 | 350968ECE5EBF882
    (3 rows)
    

ENCRYPT函数2

语法格式

DBMS_CRYPTO.ENCRYPT(
   dst IN OUT NOCOPY BLOB,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

DBMS_CRYPTO.ENCRYPT(
   dst IN OUT NOCOPY BLOB,
   src IN            CLOB         CHARACTER SET ANY_CS,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

参数说明

  • dst:解密数据的输出位置。
  • src:要破解的LOB数据。
  • typ:加密类型。
  • key:解密使用的key。
  • iv:块密码初始化向量,缺省NULL。

示例

  • 对blob类型数据进行加密-直接调用。

    select dbms_crypto.encrypt('abc'::blob,'ABCABC'::blob,4353, '123456'::raw);
    

    返回结果为:

      encrypt      
    ------------------
    57E647BDA301C9FA
    (1 row)
    
  • 对clob类型数据进行加密-直接调用。

    select dbms_crypto.encrypt('abc'::blob,'ABCABC'::clob, 4353, '123456'::raw);
    

    返回结果为:

      encrypt      
    ------------------
    D552672EE9151C95
    (1 row)
    

DECRYPT函数1

语法格式

DBMS_CRYPTO.DECRYPT(
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv  IN RAW DEFAULT NULL)
 RETURN RAW;

参数说明

  • src:要破解的RAW数据。
  • typ:加密类型。
  • key:解密使用的key。
  • iv:块密码初始化向量,缺省NULL。

示例

1、对raw类型数据进行加密,使用相同的方式进行解密-直接调用(获取加密结果)。

select dbms_crypto.encrypt('ABCABC'::raw, 4353, '123456'::raw);

返回结果为:

     encrypt      
------------------
 57E647BDA301C9FA
(1 row)

2、将加密结果使用相同的方式进行解密(此处需要使用上一步加密结果数据来替换命令中的加密结果)。

select dbms_crypto.decrypt('57E647BDA301C9FA'::raw, 4353, '123456'::raw);

返回结果为:

decrypt 
---------
 ABCABC
(1 row)

DECRYPT函数2

语法格式

DBMS_CRYPTO.DECRYPT(
   dst IN OUT NOCOPY BLOB,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

DBMS_CRYPT.DECRYPT(
   dst IN OUT NOCOPY CLOB         CHARACTER SET ANY_CS,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

参数说明

  • dst:解密数据的输出位置。
  • src:要破解的LOB数据。
  • typ:加密类型。
  • key:解密使用的key。
  • iv:块密码初始化向量,缺省NULL。

示例

1、对blob类型数据进行解密-直接调用。

select dbms_crypto.decrypt('abc'::blob,'D552672EE9151C95'::blob, 8449, '123456'::raw, 'ABC'::raw);

返回结果为:

     decrypt
------------------
 4BFE434142430202
(1 row)

2、对blob类型数据进行加密,使用相同的方式进行解密-直接调用(获取加密结果)。

select dbms_crypto.encrypt('abc'::blob,'ABCABC'::blob,4353, '123456'::raw);

返回结果为:

     encrypt      
------------------
 57E647BDA301C9FA
(1 row)

3、将加密结果使用相同的方式进行解密(此处需要使用上一步加密结果数据来替换命令中的加密结果)。

select dbms_crypto.decrypt('abc'::blob,'加密后的结果'::blob, 4353, '123456'::raw);

返回结果为:

 decrypt 
---------
 ABCABC
(1 row)

HASH函数

语法格式

DBMS_CRYPTO.Hash (
   src IN RAW,
   typ IN PLS_INTEGER)
 RETURN RAW;

DBMS_CRYPTO.Hash (
   src IN BLOB,
   typ IN PLS_INTEGER)
 RETURN RAW;

DBMS_CRYPTO.Hash (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER)
 RETURN RAW;

参数说明

  • src:要计算的原始数据。
  • typ:哈希算法类型。

示例

select dbms_crypto.hash('57E647BDA301C9FA'::blob, 2);
select dbms_crypto.hash('中文测试'::clob, 2);

返回结果分别为:

               hash               
----------------------------------
 0625EE8F90EE27BEA4AD2EC9017E5A2E
(1 row)

               hash               
----------------------------------
 089B4943EA034ACFA445D050C7913E55
(1 row)

MAC函数

语法格式

DBMS_CRYPTO.MAC (
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW)
 RETURN RAW;

DBMS_CRYPTO.MAC (
   src IN BLOB,
   typ IN PLS_INTEGER
   key IN RAW)
 RETURN RAW;

DBMS_CRYPTO.MAC (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER
   key IN RAW)
 RETURN RAW;

参数说明

  • src:要计算的原始数据。
  • typ:MAC算法类型。
  • MAC:MAC算法的key值。

示例

select dbms_crypto.mac('中文测试'::clob, 1, '123456ABC'::raw);

返回结果为:

              mac                
----------------------------------
 2CDC70BD0B266731AEE027C185E77D68
(1 row)

RANDOM_BYTES函数

语法格式

DBMS_CRYPTO.RANDOM_BYTES (
   number_bytes IN POSITIVE)
 RETURN RAW;

参数说明

number_bytes:要生成的随机字节数。

示例

select dbms_crypto.random_bytes(10) from dual;

返回结果为:

     randomz_bytes      
----------------------
 073B14CADD7E284F2417
(1 row)

RANDOM_INTEGER函数

语法格式

DBMS_CRYPTO.RANDOM_INTEGER
 RETURN BINARY_INTEGER;

示例

select dbms_crypto.random_integer() from dual;

返回结果为:

 random_integer 
---------------
    -909240370
(1 row)

RANDOM_NUMBER函数

语法格式

DBMS_CRYPTO.RANDOM_NUMBER
 RETURN NUMBER;

示例

select dbms_crypto.random_number() from dual;

返回结果为:

         random_number          
-------------------------------
 11351894157074763785441053451
(1 row)