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 データのハッシュベースのメッセージ認証コード (HMAC) 値を返します。 |
MAC(src, typ, key) | RAW | 指定されたハッシュアルゴリズムとキーを使用して、指定された CLOB データの HMAC 値を返します。 |
RANDOMBYTES(number bytes) | RAW | 強力暗号化のランダムなバイトシーケンスを含む RAW 値を返します。 |
RANDOMINTEGER() | INTEGER | ランダムな整数を返します。 |
RANDOMNUMBER() | NUMBER | 乱数を返します。 |
注意事項
Oracle データベースと同様に、PolarDB for Oracle は以下のエラーメッセージをサポートしています。
ORA-28239 - DBMS_CRYPTO.KeyNull ORA-28829 - DBMS_CRYPTO.CipherSuiteNull ORA-28827 - DBMS_CRYPTO.CipherSuiteInvalidOracle データベースとは異なり、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 RAWDECRYPTストアドプロシージャの構文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 データの名前を指定します。 |
src | 復号するソースデータを指定します。
|
type | ブロック暗号の型と修飾子を指定します。このパラメーターの値は、ソースデータの暗号化時に指定されたデータ型と一致する必要があります。
|
key | ユーザー定義の復号キーを指定します。このパラメーターの値は、ソースデータの暗号化時に指定されたキーと一致する必要があります。 |
iv | 初期化ベクトルを指定します。ソースデータの暗号化時に初期化ベクトルを指定した場合は、ソースデータの復号時にこのパラメーターを指定する必要があります。デフォルト値: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, -- ユーザー名
ciphertext RAW(9) -- 暗号化されたパスワード
);
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 データを暗号化できます。
ENCRYPT 関数の構文
ENCRYPT
(src IN RAW, typ IN INTEGER, key IN RAW,
iv IN RAW DEFAULT NULL) RETURN RAWENCRYPT ストアドプロシージャの構文
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 データの名前を指定します。 |
src | 暗号化するソースデータを指定します。
|
typ | ブロック暗号の型と修飾子を指定します。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, -- ユーザー名
ciphertext RAW(9) -- 暗号化されたパスワード
);
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 | ハッシュアルゴリズムを指定します。PolarDB でサポートされているハッシュアルゴリズムの詳細については、「サポートされているハッシュアルゴリズム」をご参照ください。 |
表 9. サポートされているハッシュアルゴリズム
ハッシュアルゴリズム | 説明 |
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 データの HMAC 値を返すことができます。
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 | HMAC 値が計算されるデータを指定します。RAW、BLOB、または CLOB データ型がサポートされています。 |
typ |
|
key | HMAC 値の計算に使用するキーを指定します。 |
表 10. MAC 関数
MAC 関数 | 説明 |
HMAC MD5 | CONSTANT INTEGER := 1; |
HMAC SH1 | CONSTANT INTEGER := 2; |
例
次の例では、DBMS_CRYPTO.MAC を使用して cleartext source 文字列の HMAC 値を取得します。
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
/* 1024 バイトのランダムなバイト列を生成 */
result := DBMS_CRYPTO.RANDOMBYTES(1024);
END;RANDOMINTEGER
RANDOMINTEGER 関数を使用して、Oracle BINARY_INTEGER データ型の使用できる範囲内のランダムな整数を返すことができます。
RANDOMINTEGER の構文
RANDOMINTEGER() RETURNS INTEGER例
次の例では、RANDOMINTEGER 関数を使用して、暗号化のランダムな整数を返します。
DECLARE
result INTEGER;
BEGIN
result := DBMS_CRYPTO.RANDOMINTEGER(); -- ランダムな整数を生成
DBMS_OUTPUT.PUT_LINE(result); -- 結果を出力
END;RANDOMNUMBER
RANDOMNUMBER 関数を使用して、Oracle NUMBER データ型の [0..2**128-1] 範囲内の数を返すことができます。
RANDOMNUMBER の構文
RANDOMNUMBER() RETURNS NUMBER例
次の例では、RANDOMNUMBER 関数を使用して、暗号化乱数を返します。
DECLARE
result NUMBER;
BEGIN
result := DBMS_CRYPTO.RANDOMNUMBER();
DBMS_OUTPUT.PUT_LINE(result);
END;
/* 次の例では、RANDOMNUMBER 関数を使用して、暗号的に安全な乱数を返します。 */