DBMS_CRYPTO パッケージの関数とストアドプロシージャを使用して、RAW、BLOB、または CLOB データを暗号化または復号することができます。 DBMS_CRYPTO 関数を使用して、暗号で保護されたランダムな値を生成することもできます。

表 1. 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 乱数を返します。

Oracle データベースと同様に、Oracle と互換性のある POLARDB は次のエラーメッセージをサポートしています。

ORA-28239-DBMS_CRYPTO.KeyNull
ORA-28829-DBMS_CRYPTO.CipherSuiteNull
ORA-28827-DBMS_CRYPTO.CipherSuiteInvalid

Oracle データベースとは異なり、以前に暗号化された情報を再暗号化しても、Oracle と互換性のある POLARDB はエラー ORA-28233 を返しません。

RAW および BLOB は PostgreSQL BYTEA データ型の同義語であり、CLOB は TEXT の同義語であることにご注意ください。

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 がストアドプロシージャとして呼び出されると、DECRYPT は BLOB または CLOB データをユーザー指定の BLOB に戻します。

パラメーター

dst

BLOB の名前を指定します。 DECRYPT ストアドプロシージャは出力を BLOB に書き込み、BLOB 内の既存のデータを上書きします。

src

復号するソースデータを指定します。 DECRYPT を関数として呼び出す場合は、RAW データを指定する必要があります。 DECRYPT をストアドプロシージャとして 呼び出す場合は、BLOB または CLOB データを指定する必要があります。

typ

ブロック暗号タイプと修飾子を指定します。 パラメーターの値は、ソースデータが暗号化されたときに指定されたタイプと一致する必要があります。 Oracle と互換性のある POLARDB は、次のブロック暗号アルゴリズム、修飾子、および暗号スイートをサポートしています。

ブロック暗号アルゴリズム
ENCRYPT_DES CONSTANT INTEGER := 1;
ENCRYPT_3DES CONSTANT INTEGER := 3;
ENCRYPT_AES CONSTANT INTEGER := 4;
ENCRYPT_AES128 CONSTANT INTEGER := 6;
ブロック暗号修飾子
CHAIN_CBC CONSTANT INTEGER := 256;
CHAIN_ECB CONSTANT INTEGER := 768;
ブロック暗号パディング修飾子
PAD_PKCS5 CONSTANT INTEGER := 4096;
PAD_NONE CONSTANT INTEGER := 8192;
ブロック暗号スイート
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;
key

ユーザー定義の復号キーを指定します。 パラメーターの値は、ソースデータが暗号化されたときに指定されたキーと一致する必要があります。

iv

省略可能です。 初期化ベクトルを指定します。 ソースデータを暗号化するときに初期化ベクトルを指定する場合は、ソースデータを復号するときにパラメーターを指定する必要があります。 デフォルト値は NULL です。

次の例では、DBMS_CRYPTO.DECRYPT 関数を使用して、パスワードテーブルから取得した暗号化されたパスワードを復号します。

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 を呼び出すときは、オブジェクトを暗号化したときに使用したものと同じパスワードタイプ、キー値、初期化ベクトルを渡す必要があることにご注意ください。

ENCRYPT

ENCRYPT 関数またはストアドプロシージャを使用して、ユーザー定義のアルゴリズム、キー、およびオプションの初期化ベクトルに基づいて、RAW、BLOB、または CLOB データを暗号化することができます。 次のコードは、DECRYPT 関数の構文を示しています。

ENCRYPT
  (src IN RAW, typ IN INTEGER, key IN RAW, 
   iv IN RAW DEFAULT NULL) RETURN RAW

次のコードは、DECRYPT ストアドプロシージャの構文を示しています。

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 を呼び出すと、ENCRYPT は BLOB または CLOB データをユーザー指定の BLOB に返します。

パラメーター

dst

BLOB の名前を指定します。 ENCRYPT ストアドプロシージャは出力を BLOB に書き込み、BLOB 内の既存のデータを上書きします。

src

暗号化するソースデータを指定します。 ENCRYPT を関数として呼び出す場合は、RAW データを指定する必要があります。 ENCRYPT をストアドプロシージャとして呼び出す場合は、BLOB または CLOB データを指定する必要があります。

typ
ブロック暗号タイプと修飾子を指定します。 Oracle と互換性のある POLARDB は、次のブロック暗号アルゴリズム、修飾子、および暗号スイートをサポートしています。
ブロック暗号アルゴリズム
ENCRYPT_DES CONSTANT INTEGER := 1;
ENCRYPT_3DES CONSTANT INTEGER := 3;
ENCRYPT_AES CONSTANT INTEGER := 4;
ENCRYPT_AES128 CONSTANT INTEGER := 6;
ブロック暗号修飾子
CHAIN_CBC CONSTANT INTEGER := 256;
CHAIN_ECB CONSTANT INTEGER := 768;
ブロック暗号パディング修飾子
PAD_PKCS5 CONSTANT INTEGER := 4096;
PAD_NONE CONSTANT INTEGER := 8192;
ブロック暗号スイート
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;
key

暗号化キーを指定します。

iv

省略可能です。 初期化ベクトルを指定します。 デフォルト値は NULL です。

次の例では、DBMS_CRYPTO.DES_CBC_PKCS5 ブロック暗号スイート (事前定義されたアルゴリズムと修飾子のセット) を使用して、パスワードテーブルから取得される値を暗号化します。

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;

パスワードの暗号化中、ENCRYPT は my secret key を鍵として、my initialization vector を初期化ベクトルとして使用します。 パスワードを復号するときは、同じキーと初期化ベクトルを使用する必要があります。

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
ハッシュアルゴリズムを指定します。 Oracle と互換性のある POLARDB は、次のハッシュアルゴリズムをサポートしています。
Hash algorithms
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 関数を使用して、RAW データまたは CLOB データのハッシュされた MAC 値を返すことができます。 HASH 関数は次の構文をサポートしています。

MAC
  (src IN RAW, typ IN INTEGER, key IN RAW) RETURN RAW
MAC
  (src IN CLOB, typ IN INTEGER, key IN RAW) RETURN RAW

パラメーター

src

ハッシュ値が計算されるデータを指定します。 RAW、BLOB、または CLOB データ型がサポートされています。

typ
MAC 機能タイプを指定します。 Oracle と互換性のある POLARDB は、次の MAC 関数タイプをサポートしています。
MAC functions
HMAC MD5 CONSTANT INTEGER := 1;
HMAC SH1 CONSTANT INTEGER := 2;
key

ハッシュ化された MAC 値の計算に使用されるキーを指定します。

次の例では、DBMS_CRYPTO.MAC を使用して、cleartext source 文字列のハッシュ値を取得します。

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;

計算中、DBMS_CRYPTO.MAC は my secret key を鍵として使用します。

RANDOMBYTES

RANDOMBYTES 関数を使用して、暗号的にランダムなバイトを含む RAW 値を返すことができます。 RAW 値の長さを指定することができます。 次のコードは、RANDOMBYTES 関数の構文を示しています。

RANDOMBYTES
  (number_bytes IN INTEGER) RETURNS RAW

パラメーター

number_bytes

関数によって返されるランダムなバイト数を指定します。

次の例では、RANDOMBYTES を使用して、長さが 1,024 バイトの値を返します。

DECLARE
  result RAW(1024);
BEGIN
  result := DBMS_CRYPTO.RANDOMBYTES(1024);
END;

RANDOMINTEGER

RANDOMINTEGER 関数を使用して、0 ~ 268、435、または 455 の整数の乱数を返すことができます。 次のコードは、RANDOMINTEGER 関数の構文を示しています。

RANDOMINTEGER() RETURNS INTEGER

次の例では、RANDOMINTEGER 関数を使用して、暗号で保護された整数の乱数を返します。

DECLARE
  result INTEGER;
BEGIN
  result := DBMS_CRYPTO.RANDOMINTEGER();
  DBMS_OUTPUT.PUT_LINE(result);
END;

RANDOMNUMBER

RANDOMNUMBER 関数を使用して、0~268、435、または 455 の乱数を返すことができます。 次のコードは、RANDOMNUMBER 関数の構文を示しています。

RANDOMNUMBER() RETURNS NUMBER

次の例では、RANDOMINTEGER 関数を使用して、暗号で保護された乱数を返します。

DECLARE
  result NUMBER;
BEGIN
  result := DBMS_CRYPTO.RANDOMNUMBER();
  DBMS_OUTPUT.PUT_LINE(result);
END;