57 DBMS_CRYPTO

DBMS_CRYPTOは格納されたデータの暗号化と復号化のためのインタフェースを提供するパッケージであり、ネットワーク通信を実行するPL/SQLプログラムとともに使用できます。 このパッケージでは、Advanced Encryption Standard (AES)暗号化アルゴリズムなど、業界標準の複数の暗号化/ハッシュ・アルゴリズムがサポートされます。 AESは、米国標準技術局(National Institute of Standards and Technology: NIST)により、Data Encryption Standard (DES)にかわるアルゴリズムとして承認されています。

ノート:

  • Oracle Database 23aiリリース以降、MD4アルゴリズムの使用はサポート対象外になりました。
  • Oracle Database 21cリリース以降、 MD5およびMD4アルゴリズムの使用は非推奨になりました。
  • Oracle Database 21cリリース以降、SQLNETおよびDBMS_CRYPTOに対するSHA-1アルゴリズムの使用は非推奨になりました。

新しいアプリケーションでは、非推奨の値は使用しないことをお薦めします。 推奨されない機能は、下位互換性を維持する目的のみでサポートされています。

この章のトピックは、次のとおりです:

参照:

DBMS_CRYPTOの概要

DBMS_CRYPTOパッケージには、暗号化に関する基本的なファンクションとプロシージャが収録されています。 このパッケージを正しく安全に使用するためには、セキュリティに関する一般的なレベルの知識と経験が必要です。

DBMS_CRYPTOパッケージでは、イメージやサウンドを含むRAWやラージ・オブジェクト(LOB)などのOracle汎用データ・タイプに対する暗号化および復号化が可能になります。 特に、BLOBおよびCLOBをサポートします。 さらに、様々なデータベース文字セット間でデータを暗号化するためのグローバリゼーション・サポートも提供します。 また、非対称キー・ファンクションもサポートしています。

次の暗号化アルゴリズムがサポートされています。

  • データ暗号化規格(DES)、トリプルDES (3DES、2キーおよび3キー) (非推奨)

  • Advanced Encryption Standard(AES)

  • MD5 (非推奨)、SHA-1 (非推奨)、SHA-2およびSHA-3の暗号化ハッシュ

  • MD5、SHA-1、SHA-2およびSHA-3のMessage Authentication Code (MAC)、SHA-3のKMACXOF

  • SM2、SM3、SM4 (SMはShangMiの略号)

DBMS_CRYPTOではブロック暗号修飾子も提供されています。 また、PKCS(公開キー暗号規格)#5などの複数のパディング・オプション、暗号ブロック連鎖(CBC)などの6種類のブロック暗号連鎖モードを選択できます。

「表57-1」は、DBMS_CRYPTOパッケージの機能の概要を示します。

表57-1 DBMS_CRYPTOの機能

パッケージの機能 DBMS_CRYPTO

暗号化アルゴリズム

DES、3DES、AES、3DES_2KEY、SM4

PKENCRYPTおよびPKDECRYPTアルゴリズム

PKENCRYPT_RSA_PKCS1_OAEP_SHA2、SM4

パディング方式

PAD_PKCS5 (PKCS5パディング)、PAD_ZERO (ゼロ・パディング) PAD_NONE (パディングなし)、PAD_ORCL (Oracleパディング)

ブロック暗号連鎖モード

CBC、CFB、ECB、OFB、GCM、CCM、XTS

暗号化ハッシュ・アルゴリズム

MD5、SHA-1、SHA-2 (SHA-256、SHA-384、SHA-512)、SM3、(MD5とSHA-1は非推奨; MD4はサポート対象外)

HASH_SHAKE128HASH_SHAKE256

キー・ハッシュ(MAC)・アルゴリズム

HMAC_MD5HMAC_SH1HMAC_SH256HMAC_SH384HMAC_SH512HMAC_SHA3_224HMAC_SHA3_256HMAC_SHA3_384HMAC_SHA3_512

Keccak MACアルゴリズム

KMACXOF_128KMACXOF_256

暗号化擬似乱数ジェネレータ

RAWNUMBERBINARY_INTEGER

データベース・タイプ

RAWCLOBBLOB

DBMS_CRYPTODBMS_OBFUSCATION_TOOLKITに代わって使用されるパッケージであり、利便性が大幅に強化されているほか、新しいシステムと既存のシステムの両方に対応できるように広範なアルゴリズムがサポートされています。 具体的には、3DES_2KEYが下位互換性を維持する目的で提供されています。 これらのアルゴリズムでは、3DES、AES、MD5、SHA-1、SHA-2と同等のセキュリティが提供されないため、使用しないことをお薦めします。

DBMS_CRYPTOのセキュリティ・モデル

Oracle Databaseでは、このパッケージがSYSスキーマにインストールされます。 必要に応じて、既存のユーザーおよびロールに、パッケージ・アクセス権限を付与できます。

DBMS_CRYPTOの定数

DBMS_CRYPTOパッケージでは、このトピックで説明する定数が使用されます。

表57-2 DBMS_CRYPTO定数

名前 タイプ 説明

AES_CCM_NONE

PLS_INTEGER

ENCRYPT_AES + CHAIN_CCM + PAD_NONE

DBMS_CRYPTOを使用してCCMモードのAESアルゴリズムでプレーン・テキストを暗号化する場合、CCMモードはパディングとともに使用できないため、DBMS_CRYPTO.ENCRYPTtyp引数を値AES_CCM_NONEに設定してパディングが無効になっていることを確認します。 1つの追加入力AAD (追加の認証済データ、オプション)および1つの追加出力TAG (非オプション)を指定します。 たとえば:

ciphertext := dbms_crypto.encrypt 
(src => plaintext, 
typ => DBMS_CRYPTO.AES_CCM_NONE , 
key => key_information, 
iv => iv_information, 
aad => aad_information, tag); 
plaintext := dbms_crypto.decrypt 
(src => plaintext, 
typ => DBMS_CRYPTO.AES_CCM_NONE , 
key => key_information, 
iv => iv_information, 
aad => aad_information, 
tag=> tag_information);

AES_GCM_NONE

PLS_INTEGER

ENCRYPT_AES + CHAIN_GCM + PAD_NONE

DBMS_CRYPTOを使用してGCMモードのAESアルゴリズムでプレーン・テキストを暗号化する場合、GCMモードはパディングとともに使用できないため、DBMS_CRYPTO.ENCRYPTtyp引数を値AES_GCM_NONEに設定してパディングが無効になっていることを確認します。 1つの追加入力AAD (追加の認証済データ、オプション)および1つの追加出力TAG (非オプション)を指定します。 たとえば:

ciphertext := dbms_crypto.encrypt 
(src => plaintext, 
typ => DBMS_CRYPTO.AES_GCM_NONE , 
key => key_information, iv => 
iv_information, 
aad => aad_information, tag); 
plaintext := dbms_crypto.decrypt 
(src => plaintext, 
typ => DBMS_CRYPTO.AES_GCM_NONE , 
key => key_information, iv => 
iv_information, 
aad => aad_information, 
tag=> tag_information);

AES_XTS_NONE

PLS_INTEGER

ENCRYPT_AES + CHAIN_XTS + PAD_NONE

XTSモードのAES暗号化アルゴリズムの定数。 この定数は、DBMS_CRYPTO.ENCRYPTで使用できます。 AESをXTSモードで使用するには、入力が1つ以上のフルブロック(16バイト)であることが必要です。

DES3_CBC_NONE

PLS_INTEGER

ENCRYPT_3DES + CHAIN_CBC + PAD_NONE

サポート対象外のDBMS_OBFUSCATION_TOOLKITを使用して過去に作成したトリプルDES暗号文をDBMS_CRYPTO使用して解読する場合は、DBMS_CRYPTO.decrypttyp引数を値DBMS_CRYPTO.DES3_CBC_NONEに設定してPKCS#5パディングが無効になるようにします。

たとえば:

plaintext := DBMS_CRYPTO.decrypt
    (src => ciphertext_from_legacy_DES3Encrypt
    ,typ => DBMS_CRYPTO.DES3_CBC_NONE
    ,key => key_information
    ,iv  => hextoraw(DBMS_CRYPTO.LEGACY_DEFAULT_IV)
    );

AES_CBC_PKCS5

PLS_INTEGER

ENCRYPT_AES + CHAIN_CBC + PAD_PKCS5

CBCモードおよびPKCS5パディングのAES暗号化アルゴリズムの定数。 この定数は、DBMS_CRYPTO.ENCRYPTで使用できます。

LEGACY_DEFAULT_IV

VARCHAR2(16)

0123456789ABCDEF

サポート対象外のDBMS_OBFUSCATION_TOOLKITを使用してトリプルDES暗号文を作成するときにIV引数を指定しなかった場合は、DBMS_CRYPTOを呼び出してトリプルDES暗号文を復号化するときに、IVhextoraw(DBMS_CRYPTO.LEGACY_DEFAULT_IV)と指定します。

たとえば:

plaintext := DBMS_CRYPTO.decrypt
    (src => ciphertext_from_legacy_DES3Encrypt
    ,typ => DBMS_CRYPTO.DES3_CBC_NONE
    ,key => key_information
    ,iv  => hextoraw(dbms_crypto.LEGACY_DEFAULT_IV)
    );

SM4_CFB_NONE

PLS_INTEGER

ENCRYPT_SM4 + CHAIN_CFB + PAD_NONE

暗号テキスト・フィードバック(CFB)モードでのSM4暗号化アルゴリズムの暗号スイート。 CFBモードは、パディングなしのモードPAD_NONEでのみ使用できます。

SM4_OFB_NONE

PLS_INTEGER

ENCRYPT_SM4 + CHAIN_OFB + PAD_NONE

出力フィードバック(OFB)モードでのSM4暗号化アルゴリズムの暗号スイート。 OFBモードは、パディングなしのモードPAD_NONEでのみ使用できます。

DBMS_CRYPTOのデータ・タイプ

DBMS_CRYPTOサブプログラムのパラメータには、次のデータ・タイプが使用されます。

表57-3 DBMS_CRYPTOデータ型

タイプ 説明

BLOB

ソースまたは宛先のバイナリLOB。

CLOB

ソースまたは宛先の文字LOB(NCLOBを除く)。

PLS_INTEGER

暗号化アルゴリズムのタイプを指定します(データ・タイプがBLOB、CLOB、RAWである場合に使用されます)。

RAW

ソースまたは宛先のRAWバッファ。

DBMS_CRYPTOのアルゴリズム

DBMS_CRYPTOパッケージには、事前定義された暗号化アルゴリズム、修飾子および暗号スイートが含まれています。

これらを、次の表に示します。

表57-4 DBMS_CRYPTO暗号化ハッシュ・ファンクション

名前 説明

HASH_MD5

128ビット・ハッシュを生成しますが、MD4 (サポート対象外)よりも複雑です。 MD5は非推奨なので注意してください。

HASH_SH1

Secure Hash Algorithm (SHA-1) (非推奨)。 160ビットのハッシュを作成します。

HASH_SH256

SHA-2。256ビットのハッシュを作成します。

HASH_SH384

SHA-2。384ビットのハッシュを作成します。

HASH_SH512

SHA-2。512ビットのハッシュを作成します。

HASH_SHA3_224

SHA-3。224ビットのハッシュを作成します。

HASH_SHA3_256

SHA-3。256ビットのハッシュを作成します。

HASH_SHA3_384

SHA-3。384ビットのハッシュを作成します。

HASH_SHA3_512

SHA-3。512ビットのハッシュを作成します。

HASH_SHAKE128

128ビットのセキュリティ・レベルで可変長ハッシュを生成します。DBMS_CRYPTO.HASH_LENにのみ使用されます。

HASH_SHAKE256

256ビットのセキュリティ・レベルで可変長ハッシュを生成します。DBMS_CRYPTO.HASH_LENにのみ使用されます。

HASH_SM3

256ビットのハッシュを作成します

表57-5 DBMS_CRYPTO MAC (メッセージ認証コード)ファンクション

名前 説明
HMAC_MD5 (非推奨) MD5 (非推奨)ハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要となります。

HMAC_SH1 (非推奨)

SHAハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要となります。

IETF RFC 2104標準に準拠します。

HMAC_SH256

SHA-2の256ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要となります。

HMAC_SH384

SHA-2の384ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要となります。

HMAC_SH512

SHA-2の512ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要となります。

HMAC_SHA3_224

SHA-3の224ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要になります。

HMAC_SHA3_256

SHA-3の256ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要になります。

HMAC_SHA3_384

SHA-3の384ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要になります。

HMAC_SHA3_512

SHA-3の512ビットのハッシュ関数と同じですが、ハッシュ値を確認するときに秘密キーが必要になります。

表57-6 DBMS_CRYPTO KMACXOFファンクション

名前 説明

KMACXOF_128

128ビット・セキュリティ・レベルの可変長KMAC。 KMACは、KECCAK Message Authentication Codeの略号です。

KMACXOF_256

256ビット・セキュリティ・レベルの可変長KMAC。

表57-7 DBMS_CRYPTO暗号化アルゴリズム

名前 説明

ENCRYPT_DES (非推奨)

データ暗号化規格。 ブロック暗号。 長さが56ビットのキーを使用します。

ENCRYPT_3DES_2KEY (非推奨)

データ暗号化規格。 ブロック暗号。 2つのキーを使用して1つのブロックを3回処理します。 有効長が112ビットのキーを使用します。

ENCRYPT_3DES (非推奨)

データ暗号化規格。 ブロック暗号。 1つのブロックを3回処理します。

ENCRYPT_AES128

Advanced Encryption Standard。 ブロック暗号。 長さが128ビットのキーを使用します。

ENCRYPT_AES192

Advanced Encryption Standard。 ブロック暗号。 長さが192ビットのキーを使用します。

ENCRYPT_AES256

Advanced Encryption Standard。 ブロック暗号。 長さが256ビットのキーを使用します。

PKENCRYPT_RSA_PKCS1_OAEP (非推奨)

公開キー暗号化アルゴリズム。復号化にのみ許可されます。

PKENCRYPT_RSA_PKCS1_OAEP_SHA2

公開キー暗号化アルゴリズム

PKENCRYPT_SM2

中国のSM2署名と暗号化アルゴリズムのサポートを提供します

ENCRYPT_SM4

ワイヤレスLANの中国政府標準WAPI (WLAN Authentication and Privacy Infrastructure)で使用されるブロック暗号で、Transport Layer Securityにも使用されます

表57-8 DBMS_CRYPTOブロック暗号スイート

名前 説明

AES_CBC_PKCS5

ENCRYPT_AES + CHAIN_CBC + PAD_PKCS5

AES_CCM_NONE

ENCRYPT_AES + CHAIN_GCM + PAD_NONE

AES_GCM_NONE

ENCRYPT_AES + CHAIN_CCM + PAD_NONE

AES_XTS_NONE

ENCRYPT_AES + CHAIN_XTS + PAD_NONE

DES_CBC_PKCS5

ENCRYPT_DES脚注1 + CHAIN_CBC脚注2+ PAD_PKCS5脚注3

DES3_CBC_PKCS5

ENCRYPT_3DES脚注1 + CHAIN_CBC脚注2 + PAD_PKCS5脚注3

脚注1

「表57-7」を参照してください

脚注2

「表57-9」を参照してください

脚注3

「表57-10」を参照してください

表57-9 DBMS_CRYPTOブロック暗号連鎖修飾子

名前 説明

CHAIN_CBC

暗号ブロック連鎖。 直前の暗号文ブロックでプレーン・テキストをXOR演算してから暗号化します。

CHAIN_CCM

Counter with CBC-MAC (CCM)モード。 汎用の認証付き暗号化ブロック暗号モードです。 AES (AES_CCM_NONE)と使用できます。 AES_CCM_NONEの暗号化には、1つの追加入力AAD (追加認証データ、オプション)と1つの追加出力TAG (非オプション)を使用します。 AES_CCM_NONEの復号化には、2つの追加入力AADとTAGを使用します。

CHAIN_CFB

Cipher-Feedback。 ブロック・サイズより小さいデータ単位を暗号化できるようにします。

CHAIN_ECB

Electronic Codebook。 個々のプレーン・テキストブロックを別々に暗号化します。

CHAIN_GCM

Galois/Counter Mode。 汎用の認証付き暗号化ブロック暗号モードです。 AES (AES_GCM_NONE)と使用できます。 AES_GCM_NONEの暗号化には、1つの追加入力AAD (追加認証データ、オプション)と1つの追加出力TAG (非オプション)を使用します。 AES_GCM_NONEの復号化には、2つの追加入力AADとTAGを使用します。

CHAIN_OFB

Output-Feedback。 ブロック暗号を同期ストリーム暗号として実行できるようにします。 CFBと似ていますが、直前の出力ブロックのうちnビットがデータ・キューの右端の位置に移動されて、暗号化を待機する点が異なります。

CHAIN_XTS

AESのチェーン・モードである、Ciphertext Stealing (XTS)を使用したXEXベースの修正コードブック・モード。 DBMS_CRYPTOおよびPAD_NONEのAESアルゴリズムで使用できます。

表57-10 DBMS_CRYPTOブロック暗号パディング修飾子

名前 説明

PAD_NONE

パディングを実行しないオプションを提供します。 コール元はブロック・サイズが正しいことを確認する必要があり、ブロック・サイズが不適切であると、エラーが戻されます。

PAD_ORCL

暗号ベクトルの末尾にパッド長が格納されている単一バイトを追加するパディングを指定します。

PAD_ZERO

0(ゼロ)からなるパディングを提供します。

DBMS_CRYPTOの制限事項

DBMS_CRYPTOパッケージでは、VARCHAR2データ・タイプは直接的にサポートされません。 VARCHAR2タイプのデータに対して暗号化操作を実行する場合は、そのデータを事前に汎用的なデータベース文字セットであるAL32UTF8に変換した後、RAWデータ・タイプに変換する必要があります。 これらの変換が完了すると、DBMS_CRYPTOパッケージによる暗号化操作が可能になります。

参照:

データ・タイプの変換ルールについては、「DBMS_CRYPTOの操作上のノート」を参照してください。

VARCHAR2の暗号化を可能にするUTL_I18N.STRING_TO_RAWコールの使用例は、「DBMS_CRYPTOの例」を参照してください。

DBMS_CRYPTOの例外

次の表に、DBMS_CRYPTOで定義された例外を示します。

表57-11 DBMS_CRYPTOの例外

例外 コード 説明

CipherSuiteInvalid

28827

指定した暗号スイートが定義されていません。

CipherSuiteNull

28829

使用する暗号スイートが指定されていません。

KeyNull

28239

暗号化キーが指定されていないか、暗号化キーにNULL値が含まれています。

KeyBadSize

28234

DESキー: 指定されたキー長が短かすぎます。 DESキーの長さは少なくとも8バイト(64ビット)にしてください。

AESキー: 指定されたキー長はサポートされていません。 AESキーの長さは、128ビット、192ビット、256ビットのいずれかにしてください。

DoubleEncryption

28233

ソース・データは以前に暗号化されています。

DBMS_CRYPTOの操作上のノート

この項では、複数のDBMS_CRYPTOの操作上のノートについて説明します。

  • 暗号化/復号化のプロシージャとファンクションの使い分け

  • HASHファンクションとMACファンクションの使い分け

  • 暗号化キーの作成と保守に関する注意事項

  • 変換ルール

暗号化/復号化のプロシージャとファンクションの使い分け

このパッケージでは、暗号化(ENCRYPT)と復号化(DECRYPT)の機能がプロシージャおよびファンクションの両方の形式で提供されています。 これらのプロシージャは、LOBデータ・タイプ(CLOBタイプとBLOBタイプを対象としてオーバーロードされたデータ・タイプ)の暗号化と復号化に使用します。 一方、ENCRYPTファンクションとDECRYPTファンクションは、RAWデータ・タイプの暗号化と復号化に使用します。 VARCHAR2タイプのデータについては、DBMS_CRYPTOパッケージのファンクションを使用して暗号化操作を実行する前に、RAWデータ・タイプに変換する必要があります。

HASHファンクションとMACファンクションの使い分け

このパッケージには、HASHファンクションおよびMACファンクションという2種類の異なる一方向ハッシュ関数が用意されています。 ハッシュ関数は任意の長さの入力メッセージを処理して、固定長のハッシュ値を戻します。 一方向ハッシュ関数は片方向のみに動作します。 入力メッセージからハッシュ値を計算するのは簡単ですが、特定のハッシュ値から入力メッセージを生成するのはきわめて困難です。 ハッシュ値の安全性を維持するには、ハッシュ値の長さを少なくとも256ビットにする必要があります。

ハッシュ値を使用すると、データが変更されたかどうかを確認することができます。 たとえば、ユーザーがデータを保存する前に、保存対象のデータに対してDBMS_CRYPTO.HASHを実行し、ハッシュ値を作成したと想定します。 保存したデータを戻すときは、同じアルゴリズムを指定し、保存済データに対してハッシュ関数を再実行します。 2回目のハッシュ値が最初のハッシュ値と同じであれば、データは変更されていません。 ハッシュ値は「データの指紋」のようなものであり、データの整合性を保証するために使用されます。

DBMS_CRYPTOHASHファンクションは一方向ハッシュ関数であり、RAWまたはLOBデータのいずれかからハッシュ値を生成するために使用できます。 MACファンクションも一方向ハッシュ関数ですが、秘密キーの機能が追加されています。 このファンクションはDBMS_CRYPTO.HASHファンクションと同様に機能しますが、秘密キーを持つユーザーのみがハッシュ値を確認できます。

MACを使用すると、複数のユーザー間でファイルを認証できます。 また、1人のユーザーがそれらを使用して、自分のファイルがウィルスなどによって変更されたかどうかを調べることもできます。 自分のファイルのMACを計算して、そのMAC値を表に保存できます。 MACファンクションを使用しなければ、ウィルスが新しいハッシュ値を計算して、表内の既存のハッシュ値を置き換えてしまう可能性があります。 MACを使用している場合、秘密キーを知らないユーザーは、ハッシュ値の読取りや書換えを実行できません。

暗号化キーの作成と保守に関する注意事項

DBMS_CRYPTOパッケージには暗号化キー用の乱数ジェネレータがありますが、暗号化キーを保守するメカニズムは用意されていません。 アプリケーションを開発するときには、このパッケージで使用される暗号化キーを安全に作成して保存するように注意する必要があります。 また、DBMS_CRYPTOパッケージによる暗号化操作と復号化操作はクライアント上ではなくサーバー上で実行されることに注意してください。 したがって、クライアントとサーバー間で暗号化キーを転送するときは、ネットワーク暗号化機能を使用して、クライアントとサーバー間の接続を保護する必要があります。 適切な保護対策を実施しないと、ネットワーク上で暗号化キーが不正傍受される可能性があります。

DBMS_CRYPTOには独自にキーを作成する機能はありませんが、キーの作成時に使用できるツールが用意されています。 たとえば、RANDOMBYTESファンクションを使用すると、キー用の乱数ジェネレータを生成できます。

DES用の暗号化キーを作成するときには、特定のキー値が弱点キーまたは準弱点キーとみなされることに注意してください。 アルゴリズムのパターンと暗号化キーの初期値のパターンを組み合せることで、暗号分析に対して脆弱な暗号文が生成される場合、その暗号化キーは弱点キーまたは準弱点キーとみなされます。 脆弱な暗号文が生成されないようにするためには、弱点キーまたは準弱点キーであることが判明しているDESキーを事前に除外する必要があります。 弱点キーまたは準弱点キーの一覧は、複数のパブリック・インターネット・サイトで参照できます。

参照:

変換ルール

  • VARCHAR2RAWに変換するには、UTL_I18N.STRING_TO_RAWファンクションを使用して次のステップを実行します。

    1. 現行のデータベース文字セット内のVARCHAR2をAL32UTF8データベース文字セット内のVARCHAR2に変換します。

    2. AL32UTF8データベース文字セット内のVARCHAR2RAWに変換します。

    次に構文の例を示します。

    UTL_I18N.STRING_TO_RAW (string, 'AL32UTF8');
    
  • RAWVARCHAR2に変換するには、UTL_I18N.RAW_TO_CHARファンクションを使用して次のステップを実行します。

    1. RAWをAL32UTF8データベース文字セット内のVARCHAR2に変換します。

    2. AL32UTF8データベース文字セット内のVARCHAR2を目的のデータベース文字セット内のVARCHAR2に変換します。

    次に構文の例を示します。

    UTL_I18N.RAW_TO_CHAR (data, 'AL32UTF8');

    参照:

    PL/SQLパッケージUTL_I18Nの使用方法の詳細は、「UTL_I18N」を参照してください。

  • RAWタイプの暗号化データをデータベース内のVARCHAR2タイプの列に保存する場合は、RAWTOHEXファンクションまたはUTL_ENCODE.BASE64_ENCODEファンクションを使用して、VARCHAR2タイプの列に適したサイズにデータを変換してください。 これらのファンクションは、データのサイズをそれぞれ2倍または4/3倍に変更します。

DBMS_CRYPTOの例

この項の例では、DBMS_CRYPTOファンクションを使用した様々なタイプのPL/SQLコーディングを示します。

例1: 暗号ブロック連鎖およびPKCS#5準拠のパディングを使用したAES暗号化

この例では、暗号ブロック連鎖および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;

例2: PKENCRYPTIONファンクションおよびPKDECRYPTIONファンクション

DECLARE
  ip_str     VARCHAR (200) := 'Secret Message';
  op_str     VARCHAR (200);
  -- Use OpenSSL to generate the private and public key (2048 bit RSA key)
  -- openssl genrsa -out private.pem 2048
  -- openssl rsa -in private.pem -outform PEM -pubout -out public.pem
  pubkey    VARCHAR (2000) := 'public_key';
  prvkey    VARCHAR (2000) := 'private_key';
  enc_raw    RAW (2000);
  dec_raw    RAW (2000);
  eType      PLS_INTEGER := DBMS_CRYPTO.PKENCRYPT_RSA_PKCS1_OAEP_SHA2;
  kType      PLS_INTEGER := DBMS_CRYPTO.KEY_TYPE_RSA;

BEGIN

  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
  DBMS_OUTPUT.PUT_LINE('Original String := ' || ip_str);
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
  enc_raw:= DBMS_CRYPTO.PKENCRYPT
  (
    src        => UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8'),
    pub_key    => UTL_I18N.STRING_TO_RAW( pubkey, 'AL32UTF8'),
    pubkey_alg => kType,
    enc_alg    => eType
  );

  dec_raw := DBMS_CRYPTO.PKDECRYPT
  (
    src        => enc_raw,
    prv_key    => UTL_I18N.STRING_TO_RAW( prvkey, 'AL32UTF8'),
    pubkey_alg => kType,
    enc_alg    => eType
  );
  op_str := UTL_I18N.RAW_TO_CHAR(dec_raw,'AL32UTF8');
  dbms_output.put_line('-------------------------------------------------');
  dbms_output.put_line('Decrypted String := ' || op_str);
  dbms_output.put_line('-------------------------------------------------');
end;
/

例3: SIGNファンクションおよびVERIFYファンクション

DECLARE
  ip_str     VARCHAR2 (200) := 'Secret Message';
  -- Use OpenSSL to generate the private and public key (2048 bit RSA key)
  -- openssl genrsa -out private.pem 2048
  -- openssl rsa -in private.pem -outform PEM -pubout -out public.pem
  pubkey    VARCHAR (2000) := 'public_key';
  prvkey    VARCHAR (2000) := 'private_key'; 
  sign_raw   RAW (2000);
  returnval  BOOLEAN := false;
  sType      PLS_INTEGER := DBMS_CRYPTO.SIGN_SHA224_RSA;
  kType      PLS_INTEGER := DBMS_CRYPTO.KEY_TYPE_RSA;
BEGIN
  sign_raw := DBMS_CRYPTO.SIGN
  (
   src        => UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8'),
   prv_key    => UTL_I18N.STRING_TO_RAW( prvkey, 'AL32UTF8'),
   pubkey_alg => kType,
   sign_alg   => sType
  );
  returnval := DBMS_CRYPTO.VERIFY
  (
   src        => UTL_I18N.STRING_TO_RAW( ip_str,'AL32UTF8'),
   sign       => sign_raw,
   pub_key    => UTL_I18N.STRING_TO_RAW( pubkey, 'AL32UTF8'),
   pubkey_alg => kType,
   sign_alg   => sType
  );
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
  IF returnval THEN
    DBMS_OUTPUT.PUT_LINE('True');
  ELSE
    DBMS_OUTPUT.PUT_LINE('False');
  END IF;
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
END;
/

例4: HASH_SHA3_256およびHASH_SHAKE256ハッシュ関数

DECLARE
  ip_str VARCHAR2 (200) := 'Secret Message';
  output_string VARCHAR2 (2000);
  source_text_raw RAW (2000);
  hash_raw RAW (2000);
BEGIN
  source_text_raw := UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8');
  hash_raw := dbms_crypto.hash(source_text_raw, dbms_crypto.hash_sha3_256);

  output_string := RAWTOHEX(hash_raw);

  DBMS_OUTPUT.PUT_LINE ('Hash string: ' || output_string);
  DBMS_OUTPUT.PUT_LINE (utl_raw.length(hash_raw);
END;
/


HASH_SHAKE256:

DECLARE
  ip_str VARCHAR2 (200) := 'Secret Message';
  output_string VARCHAR2 (2000);
  source_text_raw RAW (2000);
  hash_raw RAW (2000);
  len PLS_INTEGER := 30;
BEGIN
  source_text_raw := UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8');
  hash_raw := dbms_crypto.hash_len(source_text_raw, dbms_crypto.hash_shake256, len);

  output_string := RAWTOHEX(hash_raw);

  DBMS_OUTPUT.PUT_LINE ('Hash string: ' || output_string);
END;
/

例5: HMAC_SHA3_256およびSIGN_SHA3_256_RSA関数

DECLARE
  ip_str VARCHAR2 (200) := 'Secret Message';
  output_string VARCHAR2 (2000);
  source_text_raw RAW (2000);
  hmac_raw RAW (2000);
  testkey RAW (2000);
BEGIN
  source_text_raw := UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8');
  -- Use your test key
  testkey := HEXTORAW('');
  hmac_raw := dbms_crypto.mac(source_text_raw, dbms_crypto.HMAC_SHA3_256, testkey);

  output_string := RAWTOHEX(hmac_raw);

  DBMS_OUTPUT.PUT_LINE ('Hmac string: ' || output_string);
END;
/

SIGN_SHA3_256_RSA:

DECLARE
  ip_str VARCHAR2 (200) := 'Secret Message';
  -- Use OpenSSL to generate the private and public key (2048 bit RSA key)
  -- openssl genrsa -out private.pem 2048
  -- openssl rsa -in private.pem -outform PEM -pubout -out public.pem
  pubkey VARCHAR (2000) := 'public_key';
  prvkey VARCHAR (2000) := 'private_key';
  sign_raw RAW (2000);
  returnval BOOLEAN := false;
  sType PLS_INTEGER := DBMS_CRYPTO.SIGN_SHA3_256_RSA;
  kType PLS_INTEGER := DBMS_CRYPTO.KEY_TYPE_RSA;
BEGIN
  sign_raw := DBMS_CRYPTO.SIGN
  (
   src => UTL_I18N.STRING_TO_RAW(ip_str,'AL32UTF8'),
   prv_key => UTL_I18N.STRING_TO_RAW( prvkey, 'AL32UTF8'),
   pubkey_alg => kType,
   sign_alg => sType
  );
  returnval := DBMS_CRYPTO.VERIFY
  (
   src => UTL_I18N.STRING_TO_RAW( ip_str,'AL32UTF8'),
   sign => sign_raw,
   pub_key => UTL_I18N.STRING_TO_RAW( pubkey, 'AL32UTF8'),
   pubkey_alg => kType,
   sign_alg => sType
  );
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
  IF returnval THEN
    DBMS_OUTPUT.PUT_LINE('True');
  ELSE
    DBMS_OUTPUT.PUT_LINE('False');
  END IF;
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------');
END;
/

DBMS_CRYPTOサブプログラムの要約

この表は、DBMS_CRYPTOサブプログラムをアルファベット順に示し、簡単に説明しています。

表57-12 DBMS_CRYPTOパッケージ・サブプログラム

サブプログラム 説明

DECRYPTファンクション

ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを復号化します。

DECRYPTプロシージャ

ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用してLOBデータを復号化します。

ECDHDERIVE_SHAREDSECRETファンクション

ローカル・アプリケーションの秘密キーとリモート・アプリケーションからの公開キーを使用して共有シークレットを導出します

ECDH_GENKEYPAIRファンクション

EC公開キー/秘密キーのペアの生成

ENCRYPTファンクション

ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを暗号化します。

ENCRYPTプロシージャ

ユーザーが指定するキーとオプションのIVに基づき、ストリーム暗号またはブロック暗号を使用してLOBデータを暗号化します。

HASHファンクション

サポートされる暗号化ハッシュ・アルゴリズム(MD5、SHA-1、SHA-2)の1つをデータに適用します。

ノート:

Oracle Database 20cリリース以降、MD5およびSHA-1の使用は非推奨になりました。 MD4はサポート対象外です。 新しいアプリケーションでは、非推奨の値は使用しないことをお薦めします。 推奨されない機能は、下位互換性を維持する目的のみでサポートされています。

HASH_LENファンクション

HASHファンクションに類似していますが、PLS_INTEGER型を使用する追加の入力lengthが含まれています

MACファンクション

Message Authentication Codeアルゴリズム(MD5、SHA-1、SHA-2)をデータに適用し、キーを使用してメッセージを保護します。

ノート:

Oracle Database 20cリリース以降、MD5およびSHA-1の使用は非推奨になりました。 新しいアプリケーションでは、非推奨の値は使用しないことをお薦めします。 推奨されない機能は、下位互換性を維持する目的のみでサポートされています。
KMACXOFファンクション

MACファンクションに類似していますが、lengthcustStrのフィールドが含まれています。

PKDECRYPTファンクション

キー・アルゴリズムおよび暗号化アルゴリズムでサポートされた秘密キーを使用してRAWデータを復号化し、復号化されたデータを戻します。

PKENCRYPTファンクション

キー・アルゴリズムおよび暗号化アルゴリズムでサポートされた公開キーを使用してRAWデータを暗号化し、暗号化されたデータを戻します

RANDOMBYTESファンクション

暗号的に安全な擬似乱数バイト列を含むRAWデータ値を戻します。暗号化キー用の乱数ジェネレータとして使用できます。

RANDOMINTEGERファンクション

BINARY_INTEGERデータ・タイプの乱数を戻します。

RANDOMNUMBERファンクション

NUMBERデータ・タイプの128ビット整数を戻します。

SIGNファンクション

キー・アルゴリズムおよび署名アルゴリズムでサポートされた秘密キーを使用してRAWデータに署名し、署名を戻します

VERIFYファンクション

署名、キー・アルゴリズムでサポートされた公開キーおよび署名アルゴリズムを使用して、RAWデータを検証します。 署名が検証された場合、TRUEを戻します

DECRYPTファンクション

これらのファンクションは、ユーザーが指定するキーとオプションのIV(初期化ベクトル)に基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを復号化します。

構文

DBMS_CRYPTO.DECRYPT(
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv  IN RAW DEFAULT NULL)
 RETURN RAW;

DBMS_CRYPTO.DECRYPT (
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv IN RAW DEFAULT NULL,
   aad IN RAW DEFAULT NULL,
   tag IN RAW)
 RETURN RAW;

プラグマ

pragma restrict_references(decrypt,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-13 DECRYPTファンクションのパラメータ

パラメータ名 説明

src

復号化するRAWデータ。

typ

使用する暗号の種類(ストリーム暗号またはブロック暗号)および修飾子。

key

復号化に使用するキー。

iv

ブロック暗号で使用するオプションの初期化ベクター。 デフォルトはNULLです。

aad

追加認証付きデータ。リクエストの一部としてOracle Cloudキー管理サービスに渡す任意の文字列です。

tag

認証チェックに使用される認証タグ。

使用上のノート

  • 元のプレーン・テキストデータを復元するには、そのデータを暗号化したときと同じ暗号、修飾子、キー、IVを指定して、DECRYPTをコールする必要があります。

    参照:

    このパッケージで使用できる暗号と修飾子の詳細は、ENCRYPTファンクションの「使用上のノート」を参照してください。

  • VARCHAR2データをRAWに変換してから暗号化した場合は、UTL_I18Nパッケージを使用し、暗号化済のデータを適切なデータベース文字セットに再変換する必要があります。

    参照:

    VARCHAR2からRAWへの変換ルールの詳細は、「DBMS_CRYPTOの操作上のノート」を参照してください。

DECRYPTプロシージャ

これらのプロシージャは、ユーザーが指定するキーとオプションのIV(初期化ベクター)に基づき、ストリーム暗号またはブロック暗号を使用してLOBデータを復号化します。

構文

DBMS_CRYPTO.DECRYPT(
   dst IN OUT NOCOPY BLOB,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

DBMS_CRYPT.DECRYPT(
   dst IN OUT NOCOPY CLOB         CHARACTER SET ANY_CS,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW          DEFAULT NULL);

DBMS_CRYPTO.DECRYPT (
   dst IN OUT NOCOPY BLOB,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW DEFAULT NULL,
   aad IN            RAW DEFAULT NULL,
   tag IN            RAW);

DBMS_CRYPTO.DECRYPT (
  dst IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
  src IN            BLOB,
  typ IN            PLS_INTEGER,
  key IN            RAW,
  iv  IN            RAW DEFAULT NULL,
  aad IN            RAW DEFAULT NULL,
  tag IN            RAW);

プラグマ

pragma restrict_references(decrypt,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-14 DECRYPTプロシージャのパラメータ

パラメータ名 説明

dst

出力データのLOBロケータ。 出力のLOB <dst>の値は上書きされます。

src

入力データのLOBロケータ。

typ

使用する暗号の種類(ストリーム暗号またはブロック暗号)および修飾子。

key

復号化に使用するキー。

iv

ブロック暗号で使用するオプションの初期化ベクター。 デフォルトはすべて0(ゼロ)です。

aad

追加認証付きデータ。リクエストの一部としてOracle Cloudキー管理サービスに渡す任意の文字列です。

tag

認証チェックに使用される認証タグ。

ECDHDERIVE_SHAREDSECRETファンクション

このファンクションでは、ローカル・アプリケーションの秘密キーとリモート・アプリケーションからの公開キーを使用して共有シークレットを導出します。

構文

DBMS_CRYPTO.
DBMS_CRYPTO.ECDHDERIVE_SHAREDSECRET (
   curveid       IN  BINARY_INTEGER,
   pubkey        IN  RAW,
   privkey       IN  RAW,
   sharedsecret  OUT RAW);

パラメータ

表57-15 HASHファンクションのパラメータ

パラメータ名 説明

curveid

アルゴリズムが使用する曲線名を示す定数。 例: SECP_256_R1

pubkey

相手側からの公開鍵

privkey

秘密キー

sharedsecret

秘密鍵と相手側からの公開鍵を基にして生成された共有秘密鍵

使用上のノート

サポートされている曲線ID SECP_256_R1は、NIST推奨曲線secp256r1を示します。

ECDH_GENKEYPAIRファンクション

このファンクションでは、EC公開キー/秘密キーのペアを生成します。

構文

DBMS_CRYPTO.
DBMS_CRYPTO.ECDH_GENKEYPAIR (
   curveid       IN  BINARY_INTEGER,
   pubkey        OUT  RAW,
   privkey       OUT  RAW);

パラメータ

表57-16 HASHファンクションのパラメータ

パラメータ名 説明

curveid

アルゴリズムが使用する曲線名を示す定数。 例: SECP_256_R1

pubkey

公開キー

privkey

秘密キー

使用上のノート

サポートされている曲線ID SECP_256_R1は、NIST推奨曲線secp256r1を示します。

ENCRYPTファンクション

これらのファンクションは、ユーザーが指定するキーとオプションのIV(初期化ベクトル)に基づき、ストリーム暗号またはブロック暗号を使用してRAWデータを暗号化します。

構文

DBMS_CRYPTO.ENCRYPT(
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv  IN RAW DEFAULT NULL)
 RETURN RAW;

DBMS_CRYPTO.ENCRYPT (
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   iv  IN RAW DEFAULT NULL,
   aad IN RAW DEFAULT NULL,
   tag OUT RAW)
 RETURN RAW;

プラグマ

pragma restrict_references(encrypt,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-17 ENCRYPTファンクションのパラメータ

パラメータ名 説明

src

暗号化するRAWデータ。

typ

使用する暗号の種類(ストリーム暗号またはブロック暗号)および修飾子。

key

データの暗号化に使用する暗号化キー。

iv

ブロック暗号で使用するオプションの初期化ベクター。 デフォルトはNULLです。

aad

追加認証付きデータ。リクエストの一部としてOracle Cloudキー管理サービスに渡す任意の文字列です。

tag

認証チェックに使用される認証タグ。

使用上のノート

  • ブロック暗号は、連鎖モードまたはパディング種類に関する修飾子で修飾できます。 連鎖モードとパディング種類に関する修飾子がブロック暗号に追加されて、暗号スイートは形成されます。 最も一般的に使用される連鎖モードは暗号ブロック連鎖(CBC)であり、推奨のパディング種類はPKCS #5です。 このパッケージに定義されているブロック暗号連鎖修飾子定数およびパディング修飾子定数については、「表57-9」および「表57-10」を参照してください。

  • 暗号化と復号化に使用する暗号スイートの内容がよくわかるように、パッケージ・レベルの独自の定数を定義できます。 たとえば、DESと暗号ブロック連鎖モードを使用し、パディングを行わない暗号スイートを表すには、次のような定数を定義します。

    DES_CBC_NONE CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
                                         + DBMS_CRYPTO.CHAIN_CBC
                                         + DBMS_CRYPTO.PAD_NONE;
    

    このパッケージの定数としてすでに定義されているブロック暗号スイートについては、「表57-8」を参照してください。

  • VARCHAR2データを暗号化する場合は、そのデータを最初にAL32UTF8文字セットに変換する必要があります。

    参照:

    変換ルールについては、「DBMS_CRYPTOの操作上のノート」を参照してください。

ENCRYPTプロシージャ

これらのプロシージャは、ユーザーが指定するキーとオプションの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);

DBMS_CRYPTO.ENCRYPT (
   dst IN OUT NOCOPY BLOB,
   src IN            BLOB,
   typ IN            PLS_INTEGER,
   key IN            RAW,
   iv  IN            RAW DEFAULT NULL,
   aad IN            RAW DEFAULT NULL,
   tag OUT           RAW);

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,
   aad IN            RAW DEFAULT NULL,
   tag OUT           RAW);

プラグマ

pragma restrict_references(encrypt,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-18 ENCRYPTプロシージャのパラメータ

パラメータ名 説明

dst

出力データのLOBロケータ。 出力のLOB <dst>の値は上書きされます。

src

入力データのLOBロケータ。

typ

使用する暗号の種類(ストリーム暗号またはブロック暗号)および修飾子。

key

データの暗号化に使用する暗号化キー。

iv

ブロック暗号で使用するオプションの初期化ベクター。 デフォルトはNULLです。

aad

追加認証付きデータ。リクエストの一部としてOracle Cloudキー管理サービスに渡す任意の文字列です。

tag

認証チェックに使用される認証タグ。

使用上のノート

  • ENCRYPTでは、SM4暗号化アルゴリズムに対応するENCRYPT_SM4定数を使用できます。
  • ENCRYPTプロシージャの変換ルールの詳細は、「DBMS_DEBUGの操作上のノート」を参照してください。

HASHファンクション

一方向ハッシュ関数は、可変長の入力文字列(データ)をハッシュ値と呼ばれる固定長の(通常は入力文字列より小さい)出力文字列に変換します。 ハッシュ値は、入力データの一意の識別子(指紋のようなもの)として使用できます。 ハッシュ値を使用すると、データが変更されたかどうかを確認することができます。

一方向ハッシュ関数は、片方向のみに動作するハッシュ関数です。 入力メッセージからハッシュ値を計算するのは簡単ですが、特定のハッシュ値からデータを生成するのは困難です。 したがって、一方向ハッシュ関数はデータの整合性を保証するのに役立ちます。 一方向ハッシュ関数の使用方法の詳細は、「DBMS_CRYPTOの操作上のノート」の「HASHファンクションとMACファンクションの使い分け」を参照してください。

このファンクションは、「表57-4」に一覧表示されている、サポートされている暗号化ハッシュ・アルゴリズムのいずれかのデータに適用されます。

構文

DBMS_CRYPTO.HASH (
   src IN RAW,
   typ IN PLS_INTEGER)
 RETURN RAW;

DBMS_CRYPTO.HASH (
   src IN BLOB,
   typ IN PLS_INTEGER)
 RETURN RAW;

DBMS_CRYPTO.HASH (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER)
 RETURN RAW;

プラグマ

pragma restrict_references(hash,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-19 HASHファンクションのパラメータ

パラメータ名 説明

src

ハッシュ値が計算されるソース・データ

typ

ソース・データに適用するハッシュ・アルゴリズム

使用上のノート

  • SHA-2 (SHA-256、SHA-384、SHA-512)の使用をお薦めします。 SHA-1 (HASH_SH1)は非推奨です。

  • HASHファンクションでは、SM3ハッシュ・アルゴリズムに対応するHASH_SM3定数を使用できます。

HASH_LENファンクション

HASH_LENは、可変長のハッシュ出力を生成できるHASHファンクションの拡張です。

HASH_LENには、ハッシュ長であるPLS_INTEGER型の追加の入力lengthが含まれています。 HASH_LENは、2つのタイプのハッシュSHAKE128SHAKE256のみをサポートします。

構文

DBMS_CRYPTO.HASH_LEN (
   src IN RAW,
   typ IN PLS_INTEGER,
   length IN PLS_INTEGER)
 RETURN RAW DETERMINISTIC;

DBMS_CRYPTO.HASH_LEN (
   src IN BLOB,
   typ IN PLS_INTEGER,
   length IN PLS_INTEGER)
 RETURN RAW DETERMINISTIC;

DBMS_CRYPTO.HASH_LEN (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER,
   length IN PLS_INTEGER)
 RETURN RAW DETERMINISTIC;

パラメータ

表57-20 HASHファンクションのパラメータ

パラメータ名 説明

src

ハッシュ値が計算されるソース・データ

typ

ソース・データに適用するハッシュ・アルゴリズム

len

ハッシュ・アルゴリズムSHAKE128SHAKE256の可変長。

使用上のノート

HASH_LENでは、ハッシュ・タイプHASH_SHAKE128HASH_SHAKE256のみを使用できます。 その他のハッシュ・タイプは、このファンクションでは無効です。

MACファンクション

このファンクションはMessage Authentication Code (MAC)アルゴリズムをデータに適用し、キーを使用してメッセージを保護します。

MACは、キー依存の一方向ハッシュ関数です。 MACファンクションはHASHファンクションで説明した一方向ハッシュ関数と同様の機能を持っていますが、秘密キーの機能が追加されています。 同じ秘密キーを持つユーザーのみがハッシュ値を照合できます。 MACファンクションの使用方法の詳細は、「DBMS_CRYPTOの操作上のノート」の「HASHファンクションとMACファンクションの使い分け」を参照してください。

このパッケージに定義されているMACアルゴリズムのリストについては、「表57-5」を参照してください。

構文

DBMS_CRYPTO.MAC (
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW)
 RETURN RAW;

DBMS_CRYPTO.MAC (
   src IN BLOB,
   typ IN PLS_INTEGER
   key IN RAW)
 RETURN RAW;

DBMS_CRYPTO.MAC (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER
   key IN RAW)
 RETURN RAW;

プラグマ

pragma restrict_references(mac,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-21 MACファンクションのパラメータ

パラメータ名 説明

src

MACアルゴリズムが適用されるソース・データ

typ

ソース・データに適用するMACアルゴリズム

key

MACアルゴリズムで使用するキー

KMACXOFファンクション

KMACは、KECCAK Message Authentication Codeの略号です。 このファンクションは、MACファンクションに類似していますが、lengthcustStrのフィールドが含まれています。

構文

DBMS_CRYPTO.KMACXOF(
   src IN RAW,
   typ IN PLS_INTEGER,
   key IN RAW,
   length IN PLS_INTEGER,
   custStr IN RAW)
 RETURN RAW;

DBMS_CRYPTO.KMACXOF (
   src IN BLOB,
   typ IN PLS_INTEGER,
   key IN RAW,
   length IN PLS_INTEGER,
   custStr IN RAW)
 RETURN RAW;

DBMS_CRYPTO.KMACXOF (
   src IN CLOB CHARACTER SET ANY_CS,
   typ IN PLS_INTEGER,
   key IN RAW,
   length IN PLS_INTEGER,
   custStr IN RAW)
 RETURN RAW;

パラメータ

表57-22 KMACXOFファンクションのパラメータ

パラメータ名 説明

src

KMACXOFアルゴリズムが適用されるソース・データ。

typ

使用するKMACXOFアルゴリズム。

key

KMACXOFアルゴリズムで使用するキー

length

KMACXOF出力の長さ(バイト単位)。

custStr

KMACXOFのカスタム文字列。

PKDECRYPTファンクション

このファンクションは、キー・アルゴリズムおよび暗号化アルゴリズムでサポートされた秘密キーを使用してRAWデータを復号化し、復号化されたデータを戻します。

構文

DBMS_CRYPTO.PKDECRYPT(
   src IN RAW,
   prv_key IN RAW,
   pubkey_alg IN BINARY_INTEGER,
   enc_alg  IN BINARY_INTEGER)
 RETURN RAW;

パラメータ

表57-23 PKDECRYPTファンクションのパラメータ

パラメータ名 説明

src

復号化するRAWデータ。

prv_key

秘密キー。

pubkey_alg

KEY_TYPE_RSA RSAキー・タイプを指定します。

enc_alg

PKCS1およびOAEPパディングを使用したRSA公開キー暗号システムの場合、アルゴリズムPKENCRYPT_RSA_PKCS1_OAEPを指定します。

PKENCRYPTファンクション

このファンクションは、キー・アルゴリズムおよび暗号化アルゴリズムでサポートされた公開キーを使用してRAWデータを暗号化し、暗号化されたデータを戻します。

構文

DBMS_CRYPTO.PKENCRYPT(
   src IN RAW,
   pub_key IN RAW,
   pubkey_alg IN BINARY_INTEGER,
   enc_alg  IN BINARY_INTEGER)
 RETURN RAW;

パラメータ

表57-24 PKENCRYPTファンクションのパラメータ

パラメータ名 説明

src

暗号化するRAWデータ。

pub_key

公開キー。

pubkey_alg

KEY_TYPE_RSA RSAキー・タイプを指定します。

enc_alg

PKCS1およびOAEPパディングを使用したRSA公開キー暗号システムの場合、アルゴリズムPKENCRYPT_RSA_PKCS1_OAEPを指定します。

使用上のノート

SM2公開キー暗号化アルゴリズムに対応するPKENCRYPT_SM2定数と、SM2キー・タイプに対応するKEY_TYPE_SM2定数を使用できます。

RANDOMBYTESファンクション

このファンクションは、暗号的に安全な擬似乱数バイト列を含むRAW値を戻しますが、これは、暗号化キー用の乱数ジェネレータとして使用できます。

構文

DBMS_CRYPTO.RANDOMBYTES (
   number_bytes IN POSITIVE)
 RETURN RAW;

プラグマ

pragma restrict_references(randombytes,WNDS,RNDS,WNPS,RNPS);

パラメータ

表57-25 RANDOMBYTESファンクションのパラメータ

パラメータ名 説明

number_bytes

生成する擬似乱数バイトのバイト数

使用上のノート

number_bytesの値がRAW変数の最大長を超えないように注意してください。

RANDOMINTEGERファンクション

このファンクションは、OracleのBINARY_INTEGERデータ・タイプで表現可能な範囲の整数を戻します。

構文

DBMS_CRYPTO.RANDOMINTEGER
 RETURN BINARY_INTEGER;

プラグマ

pragma restrict_references(randominteger,WNDS,RNDS,WNPS,RNPS);

RANDOMNUMBERファンクション

このファンクションは、OracleのNUMBERデータ・タイプで表現可能な範囲([0..2**128-1])の整数乱数を戻します。

構文

DBMS_CRYPTO.RANDOMNUMBER
 RETURN NUMBER;

プラグマ

pragma restrict_references(randomnumber,WNDS,RNDS,WNPS,RNPS);

SIGNファンクション

このファンクションは、キー・アルゴリズムおよび署名アルゴリズムでサポートされた秘密キーを使用してRAWデータに署名し、署名を戻します。

構文

DBMS_CRYPTO.SIGN(
   src IN RAW,
   prv_key IN RAW,
   pubkey_alg IN BINARY_INTEGER,
   sign_alg IN BINARY_INTEGER)
 RETURN RAW;

パラメータ

表57-26 SIGNファンクションのパラメータ

パラメータ名 説明

src

署名するRAWデータ。

prv_key

秘密キー。

pubkey_alg

RSAアルゴリズムの場合はKEY_TYPE_RSA RSAキー・タイプを指定し、ECDSAアルゴリズムの場合はKEY_TYPE_ECDSA ECDSAキー・タイプを指定します。

sign_alg

「使用上のノート」にリストされているアルゴリズムのいずれかを指定します。

使用上のノート

表57-27 シグネチャ・タイプ・アルゴリズム

ハッシュ・アルゴリズム 説明

SIGN_SHA1_RSA

RSAでのSHA1ハッシュ関数

SIGN_SHA1_RSA_X931

RSAおよびX931パディングを使用したSHA1ハッシュ関数

SIGN_SHA224_ECDSA

ECDSAを使用したSHA 224ビット・ハッシュ関数

SIGN_SHA224_RSA

RSAを使用したSHA 224ビット・ハッシュ関数

SIGN_SHA256_ECDSA

ECDSAを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA256_RSA

RSAを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA256_RSA_X931

RSAおよびX931パディングを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA3_224_ECDSA

ECDSAを使用したSHA-3 224ハッシュ関数

SIGN_SHA3_224_RSA

RSAを使用したSHA-3 234ビット・ハッシュ関数

SIGN_SHA3_256_ECDSA

ECDSAを使用したSHA-3 256ビット・ハッシュ関数

SIGN_SHA3_256_RSA

RSAを使用したSHA-3 256ビット・ハッシュ関数

SIGN_SHA3_384_ECDSA

ECDSAを使用したSHA-3 384ビット・ハッシュ関数

SIGN_SHA3_384_RSA

RSAを使用したSHA-3 384ビット・ハッシュ関数

SIGN_SHA3_512_ECDSA

ECDSAを使用したSHA-3 512ハッシュ関数

SIGN_SHA3_512_RSA

RSAを使用したSHA-3 512ビット・ハッシュ関数

SIGN_SHA384_ECDSA

ECDSAを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA384_RSA

RSAを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA384_RSA_X931

RSAおよびX931パディングを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA512_ECDSA

ECDSAを使用したSHA 512ビット・ハッシュ関数

SIGN_SHA512_RSA

RSAを使用したSHA 512ビット・ハッシュ関数

SIGN_SHA512_RSA_X931

RSAおよびX931パディングを使用したSHA 512ビット・ハッシュ関数

SIGN_SM3_SM2

SM2を使用したSM3 256ビット・ハッシュ関数

使用上のノート

SM3_SM2暗号化アルゴリズムに対応するSIGN_SM3_SM2定数を使用できます。

VERIFYファンクション

このファンクションは、署名、キー・アルゴリズムでサポートされた公開キーおよび署名アルゴリズムを使用して、RAWデータを検証します。 署名が検証された場合、TRUEを戻します。

構文

DBMS_CRYPTO.VERIFY(
   src IN RAW,
   sign IN RAW,
   pub_key IN RAW,
   pubkey_alg IN BINARY_INTEGER,
   sign_alg  IN BINARY_INTEGER)
 RETURN BOOLEAN;

パラメータ

表57-28 VERIFYファンクションのパラメータ

パラメータ名 説明

src

検証するRAWデータ。

sign

メッセージの署名。

pub_key

公開キー。

pubkey_alg

RSAアルゴリズムの場合はKEY_TYPE_RSA RSAキー・タイプを指定し、ECDSAアルゴリズムの場合はKEY_TYPE_ECDSA ECDSAキー・タイプを指定します。

sign_alg

「使用上のノート」にリストされているアルゴリズムのいずれかを指定します。

使用上のノート

表57-29 検証タイプ・アルゴリズム

ハッシュ・アルゴリズム 説明

SIGN_SHA1_RSA

RSAでのSHAハッシュ関数

SIGN_SHA1_RSA_X931

RSAおよびX931パディングを使用したSHAハッシュ関数

SIGN_SHA224_ECDSA

ECDSAを使用したSHA 224ビット・ハッシュ関数

SIGN_SHA224_RSA

RSAを使用したSHA 224ビット・ハッシュ関数

SIGN_SHA256_ECDSA

ECDSAを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA256_RSA

RSAを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA256_RSA_X931

RSAおよびX931パディングを使用したSHA 256ビット・ハッシュ関数

SIGN_SHA3_224_ECDSA

ECDSAを使用したSHA-3 224ハッシュ関数

SIGN_SHA3_224_RSA

RSAを使用したSHA-3 234ビット・ハッシュ関数

SIGN_SHA3_256_ECDSA

ECDSAを使用したSHA-3 256ビット・ハッシュ関数

SIGN_SHA3_256_RSA

RSAを使用したSHA-3 256ビット・ハッシュ関数

SIGN_SHA3_384_ECDSA

ECDSAを使用したSHA-3 384ビット・ハッシュ関数

SIGN_SHA3_384_RSA

RSAを使用したSHA-3 384ビット・ハッシュ関数

SIGN_SHA3_512_ECDSA

ECDSAを使用したSHA-3 512ハッシュ関数

SIGN_SHA3_512_RSA

RSAを使用したSHA-3 512ビット・ハッシュ関数

SIGN_SHA384_ECDSA

ECDSAを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA384_RSA

RSAを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA384_RSA_X931

RSAおよびX931パディングを使用したSHA 384ビット・ハッシュ関数

SIGN_SHA512_ECDSA

ECDSAを使用したSHA 512ビット・ハッシュ関数

SIGN_SHA512_RSA

RSAを使用したSHA 512ビット・ハッシュ関数

SIGN_SHA512_RSA_X931

RSAおよびX931パディングを使用したSHA 512ビット・ハッシュ関数

SIGN_SM3_SM2

SM2を使用したSM3 256ビット・ハッシュ関数

使用上のノート

SM3_SM2暗号化アルゴリズムに対応するSIGN_SM3_SM2定数を使用できます。