VastbaseG100

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

Menu

DBMS_CRYPTO

功能描述

DBMS_CRYPTO内置包提供了用于加密和解密存储数据的接口,可以对常用的数据类型进行加密和解密,例如RAW类型、BLOB类型、CLOB类型等。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。

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

    CREATE EXTENSION pgcrypto;
    

DBMS_CRYPTO整数码

DBMS_CRYPTO包包含预定义的加密算法、修饰符和密码套件。使用加密函数时,既可以直接指定标识符名称,也支持使用其对应的整数码。

例如,使用标识符名称:

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

使用标识符对应的整数码:

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

对于使用两种或以上加密套件标识符的情况,只需要将其整数码数值相加即可。

表1 加密算法

加密算法 整数码
ENCRYPT_DES 1
ENCRYPT_3DES 3
ENCRYPT_AES128 6

表2 块密码链修饰符

加密算法 整数码
chain_ecb 768
chain_cbc 256

块密码可以用链和填充类型修饰符修改。将链接和填充类型修饰符添加到分组密码中以生成密码套件。块密码链(CBC)是最常用的链类型,PKCS #5是推荐的填充类型。

表3 块密码套件

加密算法 整数码
des_cbc_pkcs 4353
des3_cbc_pkcs 4355

表4 密码填充修饰符

加密算法 整数码
PAD_PKCS 4096
PAD_NONE 8192
PAD_PKCS5 4096

表5 HASH算法、MAC算法标识符

加密算法 整数码
hash_md5 2
hmac_md5 1

子程序

子程序中存在同名的加解密函数,它们具有不同的入参形式,后文使用“函数1”、“函数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

功能描述

使用用户指定的加密套件来对raw类型数据进行加密,返回raw类型数据。

语法格式

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。

示例

示例1: 直接调用函数进行加解密。

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)

示例2: 加密表数据。

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;

返回结果依次如下:

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

功能描述

使用用户指定的加密套件来对blob、clob类型数据进行加密,返回blob类型数据。

语法格式

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。

示例

示例1: 直接调用函数对blob类型数据进行加密。

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

返回结果为:

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

示例2: 直接调用函数对clob类型数据进行加密。

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

返回结果为:

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

DECRYPT函数1

功能描述

使用用户指定的加密套件来对raw类型数据进行解密。

语法格式

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

功能描述

使用用户指定的加密套件来对blob类型数据进行解密。

语法格式

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类型数据进行加解密。

1、加密:

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

返回结果为:

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

2、解密(使用上一步加密得到的数据)。

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

返回结果为:

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

HASH函数

功能描述

使用用户指定的hash算法来返回一个raw类型的哈希值,使用哈希值来验证数据是否已更改。算法标识符是hash_md5,整数码为2。

语法格式

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函数

功能描述

使用用户指定的MAC算法来返回一个bytea类型数据的MAC哈希值。算法标识符是hmac_md5,整数码为1。

语法格式

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函数

功能描述

生成指定长度(范围为[1, 2000])的随机字节raw值。

语法格式

DBMS_CRYPTO.RANDOM_BYTES (
   number_bytes IN POSITIVE)
 RETURN RAW;

参数说明

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

示例

生成指定长度的随机RAW值:

select dbms_crypto.random_bytes(10) from dual;

返回结果为(随机):

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

RANDOM_INTEGER函数

功能描述

用于返回integer数据类型的完整范围内的随机整数。

语法格式

DBMS_CRYPTO.RANDOM_INTEGER
 RETURN BINARY_INTEGER;

示例

返回随机整数:

select dbms_crypto.random_integer() from dual;

返回结果为(随机):

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

RANDOM_NUMBER函数

功能描述

用于返回number数据类型范围为 [0, 2128 - 1] 内的随机数据。

语法格式

DBMS_CRYPTO.RANDOM_NUMBER
 RETURN NUMBER;

示例

返回随机数据:

select dbms_crypto.random_number() from dual;

返回结果为(随机):

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