DBMS_CRYPTO パッケージの関数とストアドプロシージャを使用して、RAW、BLOB、または CLOB データを暗号化または復号することができます。 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
ブロック暗号アルゴリズム | |
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
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 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;