DBMS_CRYPTO
包提供的函数和存储过程允许您对RAW、BLOB或CLOB数据进行加密或解密。您可以使用DBMS_CRYPTO
函数来产生强加密型随机值。
DBMS_CRYPTO函数/存储过程
函数/存储过程 | 返回类型 | 描述 |
DECRYPT(src, typ, key, iv) | RAW | 解密RAW类型的数据。 |
DECRYPT(dst INOUT, src, typ, key, iv) | N/A | 解密BLOB类型的数据。 |
DECRYPT(dst INOUT, src, typ, key, iv) | N/A | 解密CLOB类型的数据。 |
ENCRYPT(src, typ, key, iv) | RAW | 加密RAW类型的数据。 |
ENCRYPT(dst INOUT, src, typ, key, iv) | N/A | 加密BLOB类型的数据。 |
ENCRYPT(dst INOUT, src, typ, key, iv) | N/A | 加密CLOB类型的数据。 |
HASH(src, typ) | RAW | 对RAW类型的数据使用哈希算法。 |
HASH(src) | RAW | 对CLOB类型的数据使用哈希算法。 |
MAC(src, typ, key) | RAW | 对于使用指定哈希算法和密钥的RAW类型的数据,返回哈希MAC值。 |
MAC(src, typ, key) | RAW | 对于使用指定哈希算法和密钥的CLOB类型的数据,返回哈希MAC值。 |
RANDOMBYTES(number bytes) | RAW | 返回指定数量的强加密随机字节。 |
RANDOMINTEGER() | INTEGER | 返回一个随机整数。 |
RANDOMNUMBER() | NUMBER | 返回一个随机数。 |
注意事项
DBMS_CRYPTO
函数/存储过程支持下列与Oracle兼容的错误消息:ORA-28239 - DBMS_CRYPTO.KeyNull ORA-28829 - DBMS_CRYPTO.CipherSuiteNull ORA-28827 - DBMS_CRYPTO.CipherSuiteInvalid
与Oracle不同,如果您对之前加密的信息再加密,PolarDB将不会返回ORA-28233错误消息。
RAW和BLOB是PostgreSQL BYTEA数据类型的同义词,CLOB是TEXT的同义词。
DECRYPT
通过使用您指定的加密算法、键及可选的初始化向量,函数DECRYPT
或存储过程DECRYPT
可解密数据。
函数
DECRYPT
的语法如下:DECRYPT (src IN RAW, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL) RETURN RAW
存储过程
DECRYPT
的语法如下:DECRYPT (dst INOUT BLOB, src IN BLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL)
或
DECRYPT (dst INOUT CLOB, src IN CLOB, typ IN INTEGER, key IN RAW, iv IN RAW DEFAULT NULL)
当DECRYPT
作为存储过程调用时,会将BLOB或CLOB数据返回给用户指定的BLOB。
参数
参数名称 | 描述 |
dst | 指定BLOB数据的名称。存储过程 |
src | 指定要解密的源数据。
|
type | 指定分组密码类型及修改器。 当对src加密时,应和指定的类型相匹配。 |
key | 指定用户定义的解密键。当对src加密时,应和指定的键相匹配。 |
iv | 指定初始化向量。当对src加密时,如果指定了一个初始化向量,那么您必须在解密src时也指定一个初始化向量。默认值为NULL。 |
表 1. 分组密码算法
分组密码算法名称 | 描述 |
ENCRYPT_DES | CONSTANT INTEGER := 1; |
ENCRYPT_3DES | CONSTANT INTEGER := 3; |
ENCRYPT_AES | CONSTANT INTEGER := 4; |
ENCRYPT_AES128 | CONSTANT INTEGER := 6; |
表 2. 分组密码修改器
分组密码修改器名称 | 描述 |
CHAIN_CBC | CONSTANT INTEGER := 256; |
CHAIN_ECB | CONSTANT INTEGER := 768; |
表 3. 分组密码填充修饰符
分组密码填充修饰符名称 | 描述 |
PAD_PKCS5 | CONSTANT INTEGER := 4096; |
PAD_NONE | CONSTANT INTEGER := 8192; |
表 4. 分组密码套件
分组密码套件名称 | 描述 |
DES_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_DES + CHAIN_CBC + PAD_PKCS5; |
DES3_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_3DES + CHAIN_CBC + PAD_PKCS5; |
AES_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_AES + CHAIN_CBC + PAD_PKCS5; |
示例
下列示例使用函数DBMS_CRYPTO.DECRYPT
,解密从passwords
表中检索出的加密的口令。
CREATE TABLE passwords
(
principal VARCHAR2(90) PRIMARY KEY, -- username
ciphertext RAW(9) -- encrypted password
);
CREATE FUNCTION get_password(username VARCHAR2) RETURN RAW AS
typ INTEGER := DBMS_CRYPTO.DES_CBC_PKCS5;
key RAW(128) := 'my secret key';
iv RAW(100) := 'my initialization vector';
password RAW(2048);
BEGIN
SELECT ciphertext INTO password FROM passwords WHERE principal = username;
RETURN dbms_crypto.decrypt(password, typ, key, iv);
END;
当调用DECRYPT
时,您必须使用在ENCRYPTING
对象中使用过的相同的密码类型、键值及初始化向量。
ENCRYPT
函数ENCRYPT
或存储过程ENCRYPT
使用用户定义的算法、键及可选的初始化向量来对RAW、BLOB或CLOB数据加密。函数ENCRYPT
的语法如下:
ENCRYPT
(src IN RAW, typ IN INTEGER, key IN RAW,
iv IN RAW DEFAULT NULL) RETURN RAW
存储过程ENCRYPT
的语法如下:
ENCRYPT
(dst INOUT BLOB, src IN BLOB, typ IN INTEGER, key IN RAW,
iv IN RAW DEFAULT NULL)
或
ENCRYPT
(dst INOUT BLOB, src IN CLOB, typ IN INTEGER, key IN RAW,
iv IN RAW DEFAULT NULL)
当将ENCRYPT
作为存储过程调用时,返回给用户指定BLOB的是BLOB或CLOB数据。
参数
参数名称 | 描述 |
dst | 指定BLOB数据的名称。存储过程 |
src | 指定要加密的源数据。
|
typ | 指定由 |
key | 用于指定加密键。 |
iv | 用于指定初始化向量。默认值为NULL。 |
表 5. 分组密码算法
分组密码算法名称 | 描述 |
ENCRYPT_DES | CONSTANT INTEGER := 1; |
ENCRYPT_3DES | CONSTANT INTEGER := 3; |
ENCRYPT_AES | CONSTANT INTEGER := 4; |
ENCRYPT_AES128 | CONSTANT INTEGER := 6; |
表 6. 分组密码修改器
分组密码修改器名称 | 描述 |
CHAIN_CBC | CONSTANT INTEGER := 256; |
CHAIN_ECB | CONSTANT INTEGER := 768; |
表 7. 分组密码填充修饰符
分组密码填充修饰符名称 | 描述 |
PAD_PKCS5 | CONSTANT INTEGER := 4096; |
PAD_NONE | CONSTANT INTEGER := 8192; |
表 8. 分组密码套件
分组密码套件名称 | 描述 |
DES_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_DES + CHAIN_CBC + PAD_PKCS5; |
DES3_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_3DES + CHAIN_CBC + PAD_PKCS5; |
AES_CBC_PKCS5 | CONSTANT INTEGER := ENCRYPT_AES + CHAIN_CBC + PAD_PKCS5; |
示例
下列示例使用了DBMS_CRYPTO.DES_CBC_PKCS5
分组密码组(一组预先定义的算法和修改器)对从passwords
表中检索出的值加密:
CREATE TABLE passwords
(
principal VARCHAR2(90) PRIMARY KEY, -- username
ciphertext RAW(9) -- encrypted password
);
CREATE PROCEDURE set_password(username VARCHAR2, cleartext RAW) AS
typ INTEGER := DBMS_CRYPTO.DES_CBC_PKCS5;
key RAW(128) := 'my secret key';
iv RAW(100) := 'my initialization vector';
encrypted RAW(2048);
BEGIN
encrypted := dbms_crypto.encrypt(cleartext, typ, key, iv);
UPDATE passwords SET ciphertext = encrypted WHERE principal = username;
END;
当对password
加密时,ENCRYPT
使用了my secret key的一个键值和my initialization vector的一个初始化向量。当解密password
时需要指定相同的键和初始化向量。
HASH
函数HASH
使用了一个用户指定的算法来返回RAW或CLOB值的哈希值。有三种可使用的HASH函数形式:
HASH
(src IN RAW, typ IN INTEGER) RETURN RAW
HASH
(src IN CLOB, typ IN INTEGER) RETURN RAW
参数
参数名称 | 描述 |
src | 指定将要产生的哈希值。您可以指定一个RAW、 BLOB或CLOB值。 |
typ | 指定HASH函数类型。PolarDB支持的HASH函数类型请参见HSAH函数类型。 |
表 9. HSAH函数类型
函数名称 | 描述 |
HASH_MD4 | CONSTANT INTEGER := 1; |
HASH_MD5 | CONSTANT INTEGER := 2; |
HASH_SH1 | CONSTANT INTEGER := 3; |
示例
以下示例使用DBMS_CRYPTO.HASH
查找字符串cleartext source的MD5哈希值:
DECLARE
typ INTEGER := DBMS_CRYPTO.HASH_MD5;
hash_value RAW(100);
BEGIN
hash_value := DBMS_CRYPTO.HASH('cleartext source', typ);
END;
MAC
MAC
函数使用了一个用户指定的MAC
函数,返回RAW或CLOB值的MAC哈希值。MAC函数有以下三种形式:
MAC
(src IN RAW, typ IN INTEGER, key IN RAW) RETURN RAW
MAC
(src IN CLOB, typ IN INTEGER, key IN RAW) RETURN RAW
MAC
(src IN BLOB, typ IN INTEGER, key IN RAW) RETURN RAW
参数
参数名称 | 描述 |
src | 指定将要产生的MAC值。您可以指定一个RAW、 BLOB或CLOB值。 |
typ | 指定要使用的 |
key | 指定将要用来计算MAC哈希值的键。 |
表 10. MAC函数
函数名称 | 描述 |
HMAC MD5 | CONSTANT INTEGER := 1; |
HMAC SH1 | CONSTANT INTEGER := 2; |
示例
以下示例为查找字符串cleartext source的MAC哈希值:
DECLARE
typ INTEGER := DBMS_CRYPTO.HMAC_MD5;
key RAW(100) := 'my secret key';
mac_value RAW(100);
BEGIN
mac_value := DBMS_CRYPTO.MAC('cleartext source', typ, key);
END;
在计算cleartext source的MAC值时,DBMS_CRYPTO.MAC
使用了my secret key的键值。
RANDOMBYTES
RANDOMBYTES
函数返回的是指定长度的RAW值,包含加密的随机字节。语法如下:
RANDOMBYTES
(number_bytes IN INTEGER) RETURNS RAW
参数
参数名称 | 描述 |
number bytes | 指定要返回的随机字节的数量。 |
示例
下列示例使用RANDOMBYTES
函数返回长度为1024字节的值:
DECLARE
result RAW(1024);
BEGIN
result := DBMS_CRYPTO.RANDOMBYTES(1024);
END;
RANDOMINTEGER
RANDOMINTEGER
函数返回的是Oracle BINARY_integer数据类型可用范围内的随机整数值。语法如下:
RANDOMINTEGER() RETURNS INTEGER
示例
以下示例使用RANDOMINTEGER
函数返回加密型随机值:
DECLARE
result INTEGER;
BEGIN
result := DBMS_CRYPTO.RANDOMINTEGER();
DBMS_OUTPUT.PUT_LINE(result);
END;
RANDOMNUMBER
RANDOMNUMBER
函数返回的随机NUMBER介于[0..2**128-1]之间。语法如下:
RANDOMNUMBER() RETURNS NUMBER
示例
以下示例使用了RANDOMNUMBER
函数来返回加密型随机数字:
DECLARE
result NUMBER;
BEGIN
result := DBMS_CRYPTO.RANDOMNUMBER();
DBMS_OUTPUT.PUT_LINE(result);
END;