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)