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数据的名称。存储过程DECRYPT的输出将会编写到这个指定名称的BLOB数据中。存储过程DECRYPT将覆盖当前dst中任何已有的数据。
src 指定要解密的源数据。
  • 如果您将DECRYPT作为函数调用,需要指定RAW数据。
  • 如果您将DECRYPT作为存储过程调用,需要指定BLOB或CLOB数据。
type 指定分组密码类型及修改器。 当对src加密时,应和指定的类型相匹配。
  • 支持的分组密码算法请参见表 1
  • 支持的分组密码修改器请参见表 2
  • 支持的分组密码套件请参见表 4
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数据的名称。存储过程ENCRYPT的输出将会编写到这个指定名称的BLOB数据中。且将覆写当前dst中已有的数据。
src 指定要加密的源数据。
  • 如果您将ENCRYPT作为函数调用,需要指定RAW数据。
  • 如果您将ENCRYPT作为存储过程调用,需要指定BLOB或CLOB数据。
typ 指定由ENCRYPT和修改器将要使用的分组密码类型及修改器。PolarDB支持下列表中的分组加密算法、修改器及密码组:
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函数类型请参见表 9
表 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 指定要使用的MAC函数。PolarDB支持的MAC函数请参见表 10
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;