DBMS_CRYPTO

DBMS_CRYPTO包提供的函数和存储过程允许您对RAW、BLOBCLOB数据进行加密或解密。您可以使用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错误消息。

  • RAWBLOBPostgreSQL BYTEA数据类型的同义词,CLOBTEXT的同义词。

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作为存储过程调用时,会将BLOBCLOB数据返回给用户指定的BLOB。

参数

参数名称

描述

dst

指定BLOB数据的名称。存储过程DECRYPT的输出将会编写到这个指定名称的BLOB数据中。存储过程DECRYPT将覆盖当前dst中任何已有的数据。

src

指定要解密的源数据。

  • 如果您将DECRYPT作为函数调用,需要指定RAW数据。

  • 如果您将DECRYPT作为存储过程调用,需要指定BLOBCLOB数据。

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、BLOBCLOB数据加密。函数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的是BLOBCLOB数据。

参数

参数名称

描述

dst

指定BLOB数据的名称。存储过程ENCRYPT的输出将会编写到这个指定名称的BLOB数据中。且将覆写当前dst中已有的数据。

src

指定要加密的源数据。

  • 如果您将ENCRYPT作为函数调用,需要指定RAW数据。

  • 如果您将ENCRYPT作为存储过程调用,需要指定BLOBCLOB数据。

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使用了一个用户指定的算法来返回RAWCLOB值的哈希值。有三种可使用的HASH函数形式:

HASH
  (src IN RAW, typ IN INTEGER) RETURN RAW
HASH
  (src IN CLOB, typ IN INTEGER) RETURN RAW 

参数

参数名称

描述

src

指定将要产生的哈希值。您可以指定一个RAW、 BLOBCLOB值。

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 sourceMD5哈希值:

DECLARE
  typ        INTEGER := DBMS_CRYPTO.HASH_MD5;
  hash_value RAW(100);
BEGIN

  hash_value := DBMS_CRYPTO.HASH('cleartext source', typ);

END;

MAC

MAC函数使用了一个用户指定的MAC函数,返回RAWCLOB值的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、 BLOBCLOB值。

typ

指定要使用的MAC函数。PolarDB支持的MAC函数请参见MAC函数

key

指定将要用来计算MAC哈希值的键。

表 10. MAC函数

函数名称

描述

HMAC MD5

CONSTANT INTEGER := 1;

HMAC SH1

CONSTANT INTEGER := 2;

示例

以下示例为查找字符串cleartext sourceMAC哈希值:

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 sourceMAC值时,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;