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 |
乱数を返します。 |
注
-
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 に書き込まれます。
パラメーター
|
パラメーター |
説明 |
|
dst |
|
|
src |
復号するソースデータです。
|
|
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, -- ユーザー名
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 を呼び出すときは、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 に書き込みます。
パラメーター
|
パラメーター |
説明 |
|
dst |
暗号化された出力の宛先 BLOB。このパラメーターは、 |
|
src |
暗号化するソースデータ。
|
|
typ |
|
|
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(2048) -- 暗号化されたパスワード
);
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 はシークレットキーと初期化ベクトルを使用します。 password を復号するには、同じキーと初期化ベクトルを指定する必要があります。
HASH
HASH 関数は、ユーザー指定のハッシュアルゴリズムを使用して、RAW または CLOB 値のハッシュ値を返します。
HASH
(src IN RAW, typ IN INTEGER) RETURN RAW
HASH
(src IN CLOB, typ IN INTEGER) RETURN RAW
パラメーター
|
パラメーター |
説明 |
|
src |
ハッシュ化するソースデータ。 データ型は RAW または 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 関数は、指定された MAC 関数を使用し、RAW、BLOB、または CLOB データに対する HMAC 値を返します。関数の構文は次のとおりです。
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. typ パラメーターの定数
|
定数 |
説明 |
|
HMAC_MD5 |
CONSTANT INTEGER := 1; |
|
HMAC_SH1 |
CONSTANT INTEGER := 2; |
例
次の例では、文字列「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」を使用して「cleartext source」の HMAC 値を計算します。
RANDOMBYTES
RANDOMBYTES 関数は、指定した数の暗号論的に安全なランダムバイトを含む RAW 値を返します。構文は次のとおりです。
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 関数は、Oracle BINARY_INTEGER データ型の範囲内でランダムな整数を返します。構文は次のとおりです:
RANDOMINTEGER() RETURNS INTEGER
例
この例では、RANDOMINTEGER 関数は暗号的に安全な整数を返します:
DECLARE
result INTEGER;
BEGIN
result := DBMS_CRYPTO.RANDOMINTEGER();
DBMS_OUTPUT.PUT_LINE(result);
END;
RANDOMNUMBER
RANDOMNUMBER 関数は、範囲 [0..2128 - 1] 内の暗号論的に安全な NUMBER 型の乱数を返します。構文は次のとおりです:
RANDOMNUMBER() RETURNS NUMBER
例
この例では、RANDOMNUMBER 関数の使用方法を示します:
DECLARE
result NUMBER;
BEGIN
result := DBMS_CRYPTO.RANDOMNUMBER();
DBMS_OUTPUT.PUT_LINE(result);
END;