全部產品
Search
文件中心

PolarDB:DBMS_CRYPTO

更新時間:Jul 06, 2024

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加密時,應和指定的類型相匹配。
key指定使用者定義的解密鍵。當對src加密時,應和指定的鍵相匹配。
iv指定初始化向量。當對src加密時,如果指定了一個初始化向量,那麼您必須在解密src時也指定一個初始化向量。預設值為NULL。
表 1. 分組密碼演算法
分組密碼演算法名稱描述
ENCRYPT_DESCONSTANT INTEGER := 1;
ENCRYPT_3DESCONSTANT INTEGER := 3;
ENCRYPT_AESCONSTANT INTEGER := 4;
ENCRYPT_AES128CONSTANT INTEGER := 6;
表 2. 分組密碼修改器
分組密碼修改器名稱描述
CHAIN_CBCCONSTANT INTEGER := 256;
CHAIN_ECBCONSTANT INTEGER := 768;
表 3. 分組密碼填充修飾符
分組密碼填充修飾符名稱描述
PAD_PKCS5CONSTANT INTEGER := 4096;
PAD_NONECONSTANT INTEGER := 8192;
表 4. 分組密碼套件
分組密碼套件名稱描述
DES_CBC_PKCS5CONSTANT INTEGER := ENCRYPT_DES + CHAIN_CBC + PAD_PKCS5;
DES3_CBC_PKCS5CONSTANT INTEGER := ENCRYPT_3DES + CHAIN_CBC + PAD_PKCS5;
AES_CBC_PKCS5CONSTANT 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_DESCONSTANT INTEGER := 1;
ENCRYPT_3DESCONSTANT INTEGER := 3;
ENCRYPT_AESCONSTANT INTEGER := 4;
ENCRYPT_AES128CONSTANT INTEGER := 6;
表 6. 分組密碼修改器
分組密碼修改器名稱描述
CHAIN_CBCCONSTANT INTEGER := 256;
CHAIN_ECBCONSTANT INTEGER := 768;
表 7. 分組密碼填充修飾符
分組密碼填充修飾符名稱描述
PAD_PKCS5CONSTANT INTEGER := 4096;
PAD_NONECONSTANT INTEGER := 8192;
表 8. 分組密碼套件
分組密碼套件名稱描述
DES_CBC_PKCS5CONSTANT INTEGER := ENCRYPT_DES + CHAIN_CBC + PAD_PKCS5;
DES3_CBC_PKCS5CONSTANT INTEGER := ENCRYPT_3DES + CHAIN_CBC + PAD_PKCS5;
AES_CBC_PKCS5CONSTANT 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_MD4CONSTANT INTEGER := 1;
HASH_MD5CONSTANT INTEGER := 2;
HASH_SH1CONSTANT 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函數請參見MAC函數
key指定將要用來計算MAC雜湊值的鍵。
表 10. MAC函數
函數名稱描述
HMAC MD5CONSTANT INTEGER := 1;
HMAC SH1CONSTANT 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;