DBMS_CRYPTOは格納されたデータの暗号化と復号化のためのインタフェースを提供するパッケージであり、ネットワーク通信を実行するPL/SQLプログラムとともに使用できます。このパッケージでは、Advanced Encryption Standard (AES)暗号化アルゴリズムなど、業界標準の複数の暗号化/ハッシュ・アルゴリズムがサポートされます。AESは、米国標準技術局(National Institute of Standards and Technology: NIST)により、Data Encryption Standard (DES)にかわるアルゴリズムとして承認されています。
|
関連項目: このパッケージの使用方法および一般的なデータ暗号化の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。 |
この章では、次の項目について説明します。
概要
セキュリティ・モデル
タイプ
アルゴリズム
制限事項
例外
使用上の注意
DBMS_CRYPTOパッケージには、暗号化に関する基本的なファンクションとプロシージャが収録されています。このパッケージを正しく安全に使用するためには、セキュリティに関する一般的なレベルの知識と経験が必要です。
DBMS_CRYPTOパッケージでは、イメージやサウンドを含むRAWやラージ・オブジェクト(LOB)などのOracle汎用データ・タイプに対する暗号化および復号化が可能になります。特に、BLOBおよびCLOBをサポートします。また、グローバリゼーション・サポートを通じて、複数の異なるデータベース・キャラクタ・セットにわたるデータの暗号化も可能です。
このパッケージでは、次の暗号化アルゴリズムがサポートされます。
データ暗号化規格(DES)、トリプルDES(3DES、2キーおよび3キー)
Advanced Encryption Standard(AES)
暗号化ハッシュとして、MD5、MD4、SHA-1、SHA-2
Message Authentication Code(MAC)として、MD5、SHA-1、SHA-2
DBMS_CRYPTOでは、ブロック暗号修飾子もサポートされます。また、PKCS(公開鍵暗号規格)#5などの複数のパディング・オプション、暗号ブロック連鎖(CBC)などの4種類のブロック暗号連鎖モードを選択できます。
表40-1に、DBMS_CRYPTOパッケージ機能の概要を示します。
表40-1 DBMS_CRYPTOの機能
| パッケージの機能 | DBMS_CRYPTO |
|---|---|
|
暗号化アルゴリズム |
DES、3DES、AES、RC4、3DES_2KEY |
|
パディング方式 |
PKCS5、0(ゼロ) |
|
ブロック暗号連鎖モード |
CBC、CFB、ECB、OFB |
|
暗号化ハッシュ・アルゴリズム |
MD5、SHA-1、SHA-2(SHA-256、SHA-384、SHA-512)、MD4 |
|
キーを使用するハッシュ(MAC)アルゴリズム |
HMAC_MD5、HMAC_SH1、HMAC_SH256、HMAC_SH384、HMAC_SH512 |
|
暗号化擬似乱数ジェネレータ |
|
|
データベース・タイプ |
|
DBMS_CRYPTOはDBMS_OBFUSCATION_TOOLKITに代わって使用されるパッケージであり、利便性が大幅に強化されているほか、新しいシステムと既存のシステムの両方に対応できるように広範なアルゴリズムがサポートされています。具体的には、3DES_2KEYおよびMD4が下位互換性を維持する目的で提供されています。これらのアルゴリズムでは、3DES、AES、MD5、SHA-1、SHA-2と同等のセキュリティが提供されないため、使用しないことをお薦めします。
このパッケージでは、次の暗号化アルゴリズム、修飾子、暗号スイートが事前に定義されています。
表40-3 DBMS_CRYPTO暗号化ハッシュ・アルゴリズム
| 名前 | 説明 |
|---|---|
|
|
128ビットのハッシュ(入力メッセージのメッセージ・ダイジェスト)を作成します。 |
|
|
MD4と同様に128ビットのハッシュを作成しますが、MD4よりも複雑です。 |
|
|
Secure Hash Algorithm(SHA-1)。160ビットのハッシュを作成します。 |
|
|
SHA-2。256ビットのハッシュを作成します。 |
|
|
SHA-2。384ビットのハッシュを作成します。 |
|
|
SHA-2。512ビットのハッシュを作成します。 |
表40-4 DBMS_CRYPTO MAC(Message Authentication Code)アルゴリズム
| 名前 | 説明 |
|---|---|
|
|
MD5ハッシュ関数と同じですが、ハッシュ値を確認するときに秘密鍵が必要となります。 |
|
|
SHAハッシュ関数と同じですが、ハッシュ値を確認するときに秘密鍵が必要となります。 |
|
|
SHA-2の256ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密鍵が必要となります。 |
|
|
SHA-2の384ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密鍵が必要となります。 |
|
|
SHA-2の512ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密鍵が必要となります。 |
1 IETF RFC 2104規格に準拠。
表40-5 DBMS_CRYPTO暗号化アルゴリズム
| 名前 | 説明 |
|---|---|
|
|
データ暗号化規格。ブロック暗号。長さが56ビットのキーを使用します。 |
|
|
データ暗号化規格。ブロック暗号。2つのキーを使用して1つのブロックを3回処理します。有効長が112ビットのキーを使用します。 |
|
|
データ暗号化規格。ブロック暗号。1つのブロックを3回処理します。 |
|
|
Advanced Encryption Standard。ブロック暗号。長さが128ビットのキーを使用します。 |
|
|
Advanced Encryption Standard。ブロック暗号。長さが192ビットのキーを使用します。 |
|
|
Advanced Encryption Standard。ブロック暗号。長さが256ビットのキーを使用します。 |
|
|
ストリーム暗号。個々のセッション単位でランダムに生成される秘密鍵を使用します。 |
1 表40-5「DBMS_CRYPTO暗号化アルゴリズム」を参照してください。
2 表40-7「DBMS_CRYPTOブロック暗号連鎖の修飾子」を参照してください。
3 表40-8「DBMS_CRYPTOブロック暗号パディングの修飾子」を参照してください。
表40-7 DBMS_CRYPTOブロック暗号連鎖の修飾子
| 名前 | 説明 |
|---|---|
|
|
Electronic Codebook。個々のプレーン・テキストブロックを別々に暗号化します。 |
|
|
暗号ブロック連鎖。直前の暗号文ブロックでプレーン・テキストをXOR演算してから暗号化します。 |
|
|
Cipher-Feedback。ブロック・サイズより小さいデータ単位を暗号化できるようにします。 |
|
|
Output-Feedback。ブロック暗号を同期ストリーム暗号として実行できるようにします。CFBと似ていますが、直前の出力ブロックのうちnビットがデータ・キューの右端の位置に移動されて、暗号化を待機する点が異なります。 |
DBMS_CRYPTOパッケージでは、VARCHAR2データ・タイプは直接的にサポートされません。VARCHAR2タイプのデータに対して暗号化操作を実行する場合は、そのデータを事前に汎用的なデータベース・キャラクタ・セットであるAL32UTF8に変換した後、RAWデータ・タイプに変換する必要があります。これらの変換が完了すると、DBMS_CRYPTOパッケージによる暗号化操作が可能になります。
表40-9に、DBMS_CRYPTOで定義された例外を示します。
表40-9 DBMS_CRYPTOの例外
| 例外 | コード | 説明 |
|---|---|---|
|
|
|
指定した暗号スイートが定義されていません。 |
|
|
|
使用する暗号スイートが指定されていません。 |
|
|
|
暗号化キーが指定されていないか、暗号化キーに |
|
|
|
DESキー: 指定されたキー長が短かすぎます。DESキーの長さは少なくとも8バイト(64ビット)にしてください。 AESキー: 指定されたキー長はサポートされていません。AESキーの長さは、128ビット、192ビット、256ビットのいずれかにしてください。 |
|
|
|
ソース・データは以前に暗号化されています。 |
このパッケージでは、暗号化(ENCRYPT)と復号化(DECRYPT)の機能がプロシージャおよびファンクションの両方の形式で提供されています。これらのプロシージャは、LOBデータ・タイプ(CLOBタイプとBLOBタイプを対象としてオーバーロードされたデータ・タイプ)の暗号化と復号化に使用します。一方、ENCRYPTファンクションとDECRYPTファンクションは、RAWデータ・タイプの暗号化と復号化に使用します。VARCHAR2タイプのデータについては、DBMS_CRYPTOパッケージのファンクションを使用して暗号化操作を実行する前に、RAWデータ・タイプに変換する必要があります。
このパッケージには、HASHファンクションおよびMACファンクションという2種類の異なる一方向ハッシュ関数が用意されています。ハッシュ関数は任意の長さの入力メッセージを処理して、固定長のハッシュ値を戻します。一方向ハッシュ関数は片方向のみに動作します。入力メッセージからハッシュ値を計算するのは簡単ですが、特定のハッシュ値から入力メッセージを生成するのはきわめて困難です。ハッシュ値の安全性を維持するには、ハッシュ値の長さを少なくとも128ビットにする必要があります。
ハッシュ値を使用すると、データが変更されたかどうかを確認することができます。たとえば、ユーザーがデータを保存する前に、保存対象のデータに対してDBMS_CRYPTO.HASHを実行し、ハッシュ値を作成したと想定します。保存したデータを戻すときは、同じアルゴリズムを指定し、保存済データに対してハッシュ関数を再実行します。2回目のハッシュ値が最初のハッシュ値と同じであれば、データは変更されていません。ハッシュ値は「データの指紋」のようなものであり、データの整合性を保証するために使用されます。
DBMS_CRYPTOのHASHファンクションは一方向ハッシュ関数であり、RAWまたはLOBデータのいずれかからハッシュ値を生成するために使用できます。MACファンクションも一方向ハッシュ関数ですが、秘密鍵の機能が追加されています。このファンクションはDBMS_CRYPTO.HASHファンクションと同様に機能しますが、秘密鍵を持つユーザーのみがハッシュ値を確認できます。
MACを使用すると、複数のユーザー間でファイルを認証できます。また、1人のユーザーがそれらを使用して、自分のファイルがウィルスなどによって変更されたかどうかを調べることもできます。自分のファイルのMACを計算して、そのMAC値を表に保存できます。MACファンクションを使用しなければ、ウィルスが新しいハッシュ値を計算して、表内の既存のハッシュ値を置き換えてしまう可能性があります。MACを使用している場合、秘密鍵を知らないユーザーは、ハッシュ値の読取りや書換えを実行できません。
DBMS_CRYPTOパッケージには暗号化キー用の乱数ジェネレータがありますが、暗号化キーを保守するメカニズムは用意されていません。アプリケーションを開発するときには、このパッケージで使用される暗号化キーを安全に作成して保存するように注意する必要があります。また、DBMS_CRYPTOパッケージによる暗号化操作と復号化操作はクライアント上ではなくサーバー上で実行されることに注意してください。したがって、クライアントとサーバー間で暗号化キーを転送するときは、ネットワーク暗号化機能を使用して、クライアントとサーバー間の接続を保護する必要があります。適切な保護対策を実施しないと、ネットワーク上で暗号化キーが不正傍受される可能性があります。
DBMS_CRYPTOには独自にキーを作成する機能はありませんが、キーの作成時に使用できるツールが用意されています。たとえば、RANDOMBYTESファンクションを使用すると、キー用の乱数ジェネレータを生成できます。
DES用の暗号化キーを作成するときには、特定のキー値が弱点キーまたは準弱点キーとみなされることに注意してください。アルゴリズムのパターンと暗号化キーの初期値のパターンを組み合せることで、暗号分析に対して脆弱な暗号文が生成される場合、その暗号化キーは弱点キーまたは準弱点キーとみなされます。脆弱な暗号文が生成されないようにするためには、弱点キーまたは準弱点キーであることが判明しているDESキーを事前に除外する必要があります。弱点キーまたは準弱点キーの一覧は、複数のパブリック・インターネット・サイトで参照できます。
|
関連項目:
|
VARCHAR2をRAWに変換するには、UTL_I18N.STRING_TO_RAWファンクションを使用して次の手順を実行します。
現行のデータベース・キャラクタ・セット内のVARCHAR2をAL32UTF8データベース・キャラクタ・セット内のVARCHAR2に変換します。
AL32UTF8データベース・キャラクタ・セット内のVARCHAR2をRAWに変換します。
構文の例:
UTL_I18N.STRING_TO_RAW (string, 'AL32UTF8');
RAWをVARCHAR2に変換するには、UTL_I18N.RAW_TO_CHARファンクションを使用して次の手順を実行します。
RAWをAL32UTF8データベース・キャラクタ・セット内のVARCHAR2に変換します。
AL32UTF8データベース・キャラクタ・セット内のVARCHAR2を目的のデータベース・キャラクタ・セット内のVARCHAR2に変換します。
構文の例:
UTL_I18N.RAW_TO_CHAR (data, 'AL32UTF8');
RAWタイプの暗号化データをデータベース内のVARCHAR2タイプの列に保存する場合は、RAWTOHEXファンクションまたはUTL_ENCODE.BASE64_ENCODEファンクションを使用して、VARCHAR2タイプの列に適したサイズにデータを変換してください。これらのファンクションは、データのサイズをそれぞれ2倍または4/3倍に変更します。
次に、暗号ブロック連鎖およびPKCS#5準拠のパディングを使用した256ビットのAESアルゴリズムを使用して、事前定義済のinput_stringを暗号化および復号化するPL/SQLブロックを示します。
DECLARE
input_string VARCHAR2 (200) := 'Secret Message';
output_string VARCHAR2 (200);
encrypted_raw RAW (2000); -- stores encrypted binary text
decrypted_raw RAW (2000); -- stores decrypted binary text
num_key_bytes NUMBER := 256/8; -- key length 256 bits (32 bytes)
key_bytes_raw RAW (32); -- stores 256-bit encryption key
encryption_type PLS_INTEGER := -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
iv_raw RAW (16);
BEGIN
DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
iv_raw := DBMS_CRYPTO.RANDOMBYTES (16);
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
-- The encrypted value "encrypted_raw" can be used here
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => encrypted_raw,
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string);
END;
表40-10 DBMS_CRYPTOパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用して |
|
|
ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用して |
|
|
ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用して |
|
|
ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用して |
|
|
サポートされる暗号化ハッシュ・アルゴリズム(MD4、MD5、SHA-1、SHA-2)の1つをデータに適用します。 |
|
|
Message Authentication Codeアルゴリズム(MD5、SHA-1、SHA-2)をデータに適用し、キーを使用してメッセージを保護します。 |
|
|
暗号的に安全な擬似乱数バイト列を含む |
|
|
|
|
|
|
このファンクションは、ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを復号化します。
構文
DBMS_CRYPTO.DECRYPT( src IN RAW, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL) RETURN RAW;
これらのプロシージャは、ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してLOBデータを復号化します。
このファンクションは、ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを暗号化します。
構文
DBMS_CRYPTO.ENCRYPT( src IN RAW, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL) RETURN RAW;
使用上の注意
ブロック暗号は、連鎖モードまたはパディング種類に関する修飾子で修飾できます。連鎖モードとパディング種類に関する修飾子がブロック暗号に追加されて、暗号スイートは形成されます。最も一般的に使用される連鎖モードは暗号ブロック連鎖(CBC)であり、推奨のパディング種類はPKCS #5です。ブロック暗号連鎖モードおよびパディング種類に関してこのパッケージで定義された修飾子定数の詳細は、表40-7および表40-8を参照してください。
暗号化と復号化に使用する暗号スイートの内容がよくわかるように、パッケージ・レベルの独自の定数を定義できます。たとえば、DESと暗号ブロック連鎖モードを使用し、パディングを行わない暗号スイートを表すには、次のような定数を定義します。
DES_CBC_NONE CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_NONE;
このパッケージですでに定数として定義されているブロック暗号スイートは、表40-6を参照してください。
VARCHAR2データを暗号化する場合は、そのデータを最初にAL32UTF8キャラクタ・セットに変換する必要があります。
保存するデータを暗号化するときに、RC4などのストリーム暗号はお薦めしません。
これらのプロシージャは、ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してLOBデータを暗号化します。
構文
DBMS_CRYPTO.ENCRYPT( dst IN OUT NOCOPY BLOB, src IN BLOB, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL); DBMS_CRYPTO.ENCRYPT( dst IN OUT NOCOPY BLOB, src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER, key IN RAW, iv IN RAW DEFAULT NULL);
一方向ハッシュ関数は、可変長の入力文字列(データ)をハッシュ値と呼ばれる固定長の(通常は入力文字列より小さい)出力文字列に変換します。ハッシュ値は、入力データの一意の識別子(指紋のようなもの)として使用できます。ハッシュ値を使用すると、データが変更されたかどうかを確認することができます。
一方向ハッシュ関数は、片方向のみに動作するハッシュ関数です。入力メッセージからハッシュ値を計算するのは簡単ですが、特定のハッシュ値からデータを生成するのは困難です。したがって、一方向ハッシュ関数はデータの整合性を保証するのに役立ちます。一方向ハッシュ関数の使用方法の詳細は、「HASHファンクションとMACファンクションの使い分け」を参照してください。
HASHファンクションは、サポートされる暗号化ハッシュ・アルゴリズム(表40-3を参照)の1つをデータに適用します。
Message Authentication Code(MAC)ファンクションは、キーで補強された一方向ハッシュ関数です。MACファンクションは「HASHファンクション」で説明した一方向ハッシュ関数と同様の機能を持っていますが、秘密鍵の機能が追加されています。同じ秘密鍵を持つユーザーのみがハッシュ値を照合できます。MACの使用方法の詳細は、「HASHファンクションとMACファンクションの使い分け」も参照してください。
MACファンクションはMACアルゴリズムをデータに適用し、キーを使用してメッセージを保護します。このパッケージで定義されているMACアルゴリズムのリストは、表40-4を参照してください。
このファンクションは、暗号的に安全な擬似乱数バイト列を含むRAW値を戻しますが、これは、暗号化キー用の乱数ジェネレータとして使用できます。RANDOMBYTESファンクションは、RSA X9.31 PRNG (Pseudo-Random Number Generator)に基づいています。