2 Oracle Crypto
Java開発者は、Oracle Crypto Software Development Kit (SDK)を使用して、データのセキュリティと整合性を確保するアプリケーションを作成できます。
ノート:
リリース11gR1以降では、Oracle Cryptoライブラリの使用はお薦めしません。かわりに、すべての暗号化操作に対して標準のJCEインタフェースを使用します。
ただし、ASN.1の解析については、そのタスクに対応するJDKの標準APIがないため、Oracle Cryptoライブラリを継続して使用する必要があります。
詳細は次の情報を参照してください。
この章のトピックは、次のとおりです:
2.1 Oracle Cryptoの機能と利点について
Oracle Cryptoでは、公開キー暗号化アルゴリズム、デジタル署名アルゴリズム、キー交換アルゴリズム、対称暗号化アルゴリズム、メッセージ・ダイジェスト・アルゴリズム、MACアルゴリズム、およびASN.1オブジェクトの構築と解析のためのメソッドがサポートされています。
Oracle Cryptoでは次の機能が提供されます。
-
公開キー暗号化。RSAなど。
-
デジタル署名アルゴリズム。DSA、RSAなど。
-
キー交換アルゴリズム。Diffie-Hellmanなど。
-
対称暗号化アルゴリズム。Blowfish、AES、DES、3DES、RC2、RC4など。
-
メッセージ・ダイジェスト・アルゴリズム。SHA-1、SHA-256、SHA-384、SHA-512など
-
MACアルゴリズム。HMAC-MD5、HMAC-SHA-1など。
-
ASN.1オブジェクトの構築および解析のためのメソッド。
2.2 Oracle Cryptoパッケージについて
Oracle Cryptoには、基本暗号化プリミティブ、数学関数を処理するユーティリティ・クラス、様々なユーティリティ・クラス、およびBERエンコードとDERエンコードのASN.1構造体の読取り機能と書込み機能のパッケージが含まれています。
Oracle Cryptoには次のパッケージが含まれます。
-
oracle.security.crypto.core
- 基本暗号化プリミティブ -
oracle.security.crypto.core.math
- 数学関数を処理するユーティリティ・クラス -
oracle.security.crypto.util
- 様々なユーティリティ・クラス -
oracle.security.crypto.asn1
- BERエンコードおよびDERエンコードのASN.1構造体の読取りと書込みのための機能
2.3 Oracle Cryptoの環境設定
Oracle Crypto SDKを使用するには、システムにJava Development Kit (JDK)バージョン17以上が必要です。CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。
osdt_core.jar
ファイルがCLASSPATH
にあることを確認します。
たとえば、CLASSPATH
は次のようになります。
%ORACLE_HOME%\modules\oracle.osdt\osdt_core.jar
関連項目:
2.4 Oracle Cryptoのコア・クラスとインタフェースの理解および使用方法
Oracle Cryptoは複数のコア・クラスとインタフェースで構成されます。これらは、キー・クラス、キー生成クラス、Cipherクラス、署名クラス、メッセージ・ダイジェスト・クラス、キー合意クラスおよび擬似乱数ジェネレータ・クラスに分類されます。
この項では、Oracle Cryptoのコア・クラスとインタフェースの使用について説明し、コード例を示します。次の各項で、さらに詳しく説明します。
2.4.1 Oracle Cryptoのキー・クラスについて
Oracle Cryptoでは、キーの処理のために複数のクラスとインタフェースが提供されます。
これらのクラスとインタフェースを次に示します。
2.4.1.1 oracle.security.crypto.core.Keyインタフェース
このインタフェースはキーを表しており、暗号化または復号化、デジタル署名の生成または検証、MACの生成または検証に使用できます。キーは、秘密キー、公開キーまたは対称キーです。
2.4.1.2 oracle.security.crypto.core.PrivateKeyインタフェース
このインタフェースは秘密キーを表します。これは、暗号化された秘密キーを保持するRSAPrivateKey
、DSAPrivateKey
、DHPrivateKey
、ECPrivateKey
またはPrivateKeyPKCS8
インスタンスです。
2.4.1.3 oracle.security.crypto.core.PublicKeyインタフェース
このインタフェースは公開キーを表します。これは、RSAPublicKey
、DSAPublicKey
、DHPublicKey
またはECPublicKey
インスタンスです。
2.4.2 Oracle Cryptoのキー生成クラスの使用
Oracle Cryptoでは、キーを生成するためのクラスが提供されます。
これらのクラスを次に示します。
2.4.2.1 oracle.security.crypto.core.KeyPairGeneratorクラスの使用方法
この抽象クラスは、RSA、DSA、Diffie-HellmanまたはECDSAなどのキー・ペアを生成するために使用されます。
新しいキー・ペア・ジェネレータを取得するには、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールし、新しいKeyPairGenerator
インスタンスを作成します。次の例に、新しいKeyPairGenerator
インスタンスを作成する方法を示します。
KeyPairGenerator kpg = KeyPairGenerator.getInstance(AlgID.rsaEncryption);
これにより、具体クラスRSAKeyPairGenerator
、DSAKeyPairGenerator
、DHKeyPairGenerator
またはECKeyPairGenerator
の1つから、KeyPairGenerator
オブジェクトが作成されます。
いずれかのinitialize()
メソッドを使用して、キー・ペア・ジェネレータを初期化します。generateKeyPair()
メソッドを使用して、キー・ペアを生成します。次の例に、キー・ペア・ジェネレータを初期化してキー・ペアを生成する方法を示します。
kpg.initialize(1024, RandomBitsSource.getDefault()); KeyPair kp = kpg.generateKeyPair(); PrivateKey privKey = kp.getPrivate(); PublicKey pubKey = kp.getPublic();
output()
メソッドを使用してキーを保存するか、秘密キーの場合は、暗号化してからPrivateKeyPKCS8
クラスを使用して保存します。次の例に、キー・ペアを保存する方法を示します。
FileOutputStream pubKeyFos = new FileOutputStream("my-pub-key.der"); pubKey.output(pubKeyFos); pubKeyFos.close(); PrivateKeyPKCS8 privKeyPKCS8 = new PrivateKeyPKCS8(privKey, "myPassword"); FileOutputStream privKeyFos = new FileOutputStream("my-encrypted-priv-key.der"); privKeyPKCS8.output(privKeyFos); privKeyFos.close();
2.4.2.2 oracle.security.crypto.core.SymmetricKeyGeneratorクラスの使用方法
このクラスでは、Blowfish、DES、3DES、RC4、RC2、AES、HMACキーなどの対称キー・ペアが生成されます。
新しい対称キー・ジェネレータを取得するには、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールし、新しいSymmetricKeyGenerator
インスタンスを作成します。次の例に、新しいSymmetricKeyGenerator
インスタンスを作成する方法を示します。
SymmetricKeyGenerator skg = SymmetricKeyGenerator.getInstance(AlgID.desCBC);
generateKey()
メソッドを使用してキー・ペアを生成します。次に、getEncoded()
メソッドを使用してキーを保存します。次の例に、対称キー・ペアを生成して保存する方法を示します。
SymmetricKey sk = skg.generateKey();
FileOutputStream symKeyFos =
new FileOutputStream("my-sym-key.der");
symKeyFos.write(sk.getEncoded());
symKeyFos.close();
2.4.3 Oracle CryptoのCipherクラスの使用方法
Oracle Cryptoでは、対象暗号のクラス、RSA暗号のクラス、およびパスワード・ベース暗号化のメソッドが提供されます。
Oracle Cryptoの暗号のコア・クラスとインタフェースは、次のように分類されます。
2.4.3.1 対称暗号の使用方法
対称暗号は、ブロック暗号(Blowfish、DES、3DES、RC2、AESなど)とストリーム暗号(RC4など)の2つに分類されます。
対称暗号は、次の4つの操作で使用できます。
-
RAWデータの暗号化。暗号化するデータを渡して、いずれかの
encrypt()
メソッドを使用します。 -
暗号化されたデータの復号化。暗号化されたデータを復号化するために渡して、いずれかの
decrypt()
メソッドを使用します。 -
秘密キーまたは対称キーのラップ。暗号化する秘密キーまたは対称キーを渡して、いずれかの
wrapKey()
メソッドを使用します。 -
暗号化された秘密キーまたは対称キーのラップ解除。暗号化された秘密キーまたは対称キーを復号化するために渡して、
unwrapPrivateKey()
またはunwrapSymmetricKey()
メソッドを使用します。
ブロック暗号の具体クラスは、oracle.security.crypto.core.BlockCipher
抽象クラスを拡張したもので、これはoracle.security.crypto.core.Cipher
クラスを拡張したものです。ストリーム暗号クラスは、oracle.security.crypto.core.Cipher
クラスを直接拡張したものです。
新しいCipher
インスタンスを作成するには、AlgorithmIdentifier
オブジェクトとKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。
次の例に、新しいCipherインスタンスを作成する方法を示します。まず、RC4オブジェクトが作成され、指定したキーで初期化されます。次に、ブロック暗号DESオブジェクトが作成され、指定したキーと空白の埋込みで初期化されます。これで、暗号が作成され、渡したパラメータで初期化されます。既存の暗号を再度初期化するには、いずれかのinitialize()
メソッドをコールします。
Cipher rc4 = Cipher.getInstance(AlgID.rc4, rc4SymKey); Cipher desCipher = Cipher.getInstance(AlgID.desCBC, desSymKey, Padding.PKCS5);
CBC暗号を使用する場合、AlgorithmIdentifier
オブジェクトは、RC2暗号の初期化ベクトル(IV)や有効なキーの長さなどの、暗号化パラメータを保持することができます。ブロック暗号を作成または初期化する際に暗号化パラメータを指定するには、これらのパラメータを使用してCBCAlgorithmIdentifier
オブジェクトまたはRC2AlgorithmIdentifier
オブジェクトを構築します。次の例に、CBC暗号とRC2暗号を作成して初期化する方法を示します。
CBCAlgorithmIdentifier cbcAlgID = new CBCAlgorithmIdentifier(AlgID.desCBC, iv); desCipher.initialize(cbcAlgID, desSymKey, Padding.PKCS5); RC2AlgorithmIdentifier rc2AlgID = new RC2AlgorithmIdentifier(iv, 56); BlockCipher rc2Cipher = (BlockCipher)Cipher.getInstance(rc2AlgID, rc2SymKey, Padding.PKCS5);
2.4.3.2 RSA暗号の使用方法
RSA暗号は、RSAES-OAEPおよびRSAES-PKCS1-v1_5の暗号化スキームをサポートするPKCS#1 v2.0の実装です。仕様に従い、新しいアプリケーションにはRSAES-OAEPを推奨しており、RSAES-PKCS1-v1_5は、既存のアプリケーションおよびプロトコルとの互換性を保つためにのみ含まれています。
これらの暗号化スキームは、RSAの暗号化プリミティブと復号化プリミティブをencodingメソッドに組み合せるために使用されます。暗号化と復号化は、encrypt(byte[])
およびdecrypt(byte[])
メソッドのみで実行できます。
RSA暗号は、次の4つの操作で使用できます。
-
RAWデータの暗号化。暗号化するデータを渡して、いずれかの
encrypt()
メソッドを使用します。 -
暗号化されたデータの復号化。暗号化されたデータを復号化するために渡して、いずれかの
decrypt()
メソッドを使用します。 -
キーのラップ。暗号化するキーを渡して、
wrapKey()
メソッドを使用します。 -
暗号化したキーのラップ解除。暗号化されたキーを復号化するために渡して、
unwrapSymmetricKey()
メソッドを使用します。
新しいCipher
インスタンスを作成するには、AlgorithmIdentifier
オブジェクトとKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。次の例に、RSApkcs1
オブジェクトを作成し、指定したキーで初期化する方法を示します。この暗号はデータの暗号化または復号化に使用できます。
Cipher rsaEnc = Cipher.getInstance(AlgID.rsaEncryption, pubKey); byte[] encryptedData = rsaEnc.encrypt(data); Cipher rsaDec = Cipher.getInstance(AlgID..rsaEncryption, privKey); byte[] decryptedData = rsaDec.decrypt(encryptedData);
RSA暗号を使用する場合、AlgorithmIdentifier
オブジェクトは、RSAES-OAEPのマスク生成関数などの暗号化パラメータを保持できます。RSA暗号を作成または初期化する際にこれらのパラメータを指定するには、OAEPAlgorithmIdentifier
を構築するか、oracle.security.crypto.core.AlgID
インタフェースにあるデフォルトのオブジェクトを使用します。
2.4.3.3 パスワード・ベース暗号化(PBE)の使用方法
oracle.security.crypto.core.PBE
抽象クラスでは、パスワード・ベース暗号化(PBE)操作のためのメソッドが提供されます。PBEを拡張した具体クラスは、PKCS5PBE
クラスとPKCS12PBE
クラスです。
PBEオブジェクトは、次の4つの操作で使用できます。
-
RAWデータの暗号化。たとえば:
byte[] encData = pbeEnc.encrypt("myPassword", data);
-
暗号化されたデータの復号化。たとえば:
byte[] decData = pbeDec.decrypt("myPassword", encData);
-
秘密キーまたは対称キーのラップ。たとえば:
byte[] encPrivKey = pbeEnc.encryptPrivateKey("myPassword", privKey); byte[] encSymKey = pbeEnc.encryptSymmetricKey("myPassword", symKey);
-
暗号化された秘密キーまたは対称キーのラップ解除。たとえば:
PrivateKey decPrivKey = pbeDec.decryptPrivateKey("myPassword", encPrivKey); SymmetricKey decSymKey = pbeDec.decryptSymmetricKey("myPassword", encSymKey);
新しいPBEインスタンスを作成するには、PBEAlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。たとえば:
PBE pbeEnc = PBE.getInstance(pbeAlgID);
これにより、PKCS5PBE
オブジェクトが作成され、指定したPBEアルゴリズムで初期化されます。PBEは、データの暗号化や復号化、またはキーのラップやラップ解除に使用できます。
PBEオブジェクトを使用する場合、AlgorithmIdentifier
オブジェクトは、ソルトまたは反復カウントなどの暗号化パラメータと、使用するPBEアルゴリズムを指定するASN.1オブジェクト識別子を保持できます。PBEを作成または初期化する際にこれらのパラメータを指定するには、暗号化パラメータを使用してPBEAlgorithmIdentifier
オブジェクトを構築します。
PBEオブジェクトを作成する例を示します。
PBEAlgorithmIdentifier pbeAlgID = new PBEAlgorithmIdentifier(PBEAlgorithmIdentifier.pbeWithMD5AndDES_CBC, salt, 1024); pbeEnc.initialize(pbeAlgID); PBE pbeDec = PBE.getInstance(pbeAlgID);
2.4.4 Oracle Cryptoの署名クラスの使用方法
oracle.security.crypto.core.Signature
抽象クラスでは、署名や署名の検証を行うメソッドが提供されます。Signature
クラスを拡張した具体クラスは、RSAMDSignature
、DSA
およびECDSA
クラスです。
署名の操作に使用できるアルゴリズムを次に示します。
-
RSAの場合:
AlgID.sha_1WithRSAEncryption
-
DSAの場合:
AlgID.dsaWithSHA1
-
ECDSAの場合:
AlgID.ecdsaWithSHA1
新しいSignature
インスタンスを作成するには、AlgorithmIdentifier
オブジェクトと、PrivateKey
オブジェクトまたはPublicKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。次の例に、新しいSignature
オブジェクトを作成し、指定したアルゴリズムで初期化する方法を示します。
Signature rsaSign = Signature.getInstance(AlgID.sha_1WithRSAEncryption); Signature rsaVerif = Signature.getInstance(AlgID.sha_1WithRSAEncryption);
次の例に、Signature
オブジェクトのキー、および署名または検証する文書を設定する方法を示します。
rsaSign.setPrivateKey(privKey); rsaSign.setDocument(data); rsaVerif.setPublicKey(pubKey); rsaVerif.setDocument(data);
次の例に、秘密キーを使用して署名を計算し、公開キーと署名バイトを使用して署名を検証する方法を示します。
byte[] sigBytes = rsaSign.sign(); boolean verified = rsaVerif.verify(sigBytes);
2.4.5 Oracle Cryptoのメッセージ・ダイジェスト・クラスの使用
Oracle Cryptoには、データのハッシング、ダイジェストおよび計算を行うためのメッセージ・ダイジェスト・クラスが含まれています。
Oracle Cryptoでは、次のメッセージ・ダイジェスト・クラスが提供されます。
2.4.5.1 oracle.security.crypto.core.MessageDigestクラスの使用方法
MessageDigest
抽象クラスでは、データのハッシュとダイジェストのメソッドが提供されます。MessageDigest
クラスを拡張した具体クラスは、MD2
、MD4
、MD5
およびSHA
クラスです。
ノート:
リリース14.1.2以降では、MD2
、MD4
およびMD5
クラスは非推奨になりました。
メッセージ・ダイジェスト操作に使用できるアルゴリズムは、AlgID.sha_1
、AlgID.sha_256
、AlgID.sha_384
およびAlgID.sha_512
です。
メッセージ・ダイジェストを作成する基本的なプロセスを次に示します。
- 新しい
MessageDigest
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。 - ダイジェストするデータを追加します。
- ハッシュ値を計算します。
次の例に、SHAメッセージ・ダイジェスト・オブジェクトを作成する方法を示します。
//Create a new SHA MessageDigest object MessageDigest sha = Signature.getInstance(AlgID.sha_1); //Add the data to be digested sha_1.udpate(data1); sha_1.udpate(data2); //Compute the hash value sha_1.computeCurrent(); byte[] digestBits = sha_1.getDigestBits();
2.4.5.2 oracle.security.crypto.core.MACクラスの使用方法
MAC
抽象クラスでは、メッセージ認証コード(MAC)の計算と検証のためのメソッドが提供されます。MAC
を拡張した具体クラスはHMAC
クラスです。
MACの操作に使用できるアルゴリズムは、AlgID.hmacSHA
およびAlgID.hmacWithSHA1
です。
MACを作成する基本的なプロセスを次に示します。
- 新しい
MAC
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトおよびSymmetricKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。 - ダイジェストするデータを追加します。
- MAC値を計算して検証します。
次の例に、HMAC-SHA1アルゴリズムを使用して、新しいHMACオブジェクトを作成する方法を示します。
//Create an HMAC object with the HMAC-SHA1 algorithm MAC hmacSha1Compute = MAC.getInstance(AlgID.hmacSHA, hmacSha1Key); //Add the data to be digested hmacSha1Compute.udpate(data); //Compute the MAC value and verify byte[] macValue = hmacSha1Compute.computeMAC(); boolean verified = hmacSha1Verify.verifyMAC(data, macValue);
2.4.6 Oracle Cryptoのキー合意クラスの使用方法
oracle.security.crypto.core.KeyAgreement
抽象クラスでは、公開キー合意スキーム(Diffie-Hellmanなど)のためのメソッドが提供されます。KeyAgreement
クラスを拡張した具体クラスは、DHKeyAgreement
およびECDHKeyAgreement
クラスです。
キー合意の操作に使用できるアルゴリズムは、AlgID.dhKeyAgreement
およびECDHKeyAgreement
(楕円曲線Diffie-Hellmanキー合意)です。
キー合意の基本的なプロセスを次に示します。
- 新しい
KeyAgreement
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。 - ローカルの秘密キーと相手の公開キーを設定します。
- 共有秘密値を計算します。
次の例に、キー合意を実行する方法を示します。
//Create a DH key agreement object KeyAgreement dh = KeyAgreement.getInstance(AlgID.dhKeyAgreement); //Set the private key and public key dh.setPrivateKey(privKey); dh.setPublicKey(otherPubKey); //Compute the shared secret byte[] sharedSecret = dh.generateSecret();
2.4.7 Oracle Cryptoの擬似乱数ジェネレータ・クラスの使用方法
暗号化では、乱数はキーを生成するために使用されます。暗号化システムでは、攻撃側から推測できないように、暗号の強度が高い(擬似)乱数が必要です。Oracle Cryptoでは、擬似乱数ジェネレータ(PRNG)クラスが提供されます。
これらの擬似乱数ジェネレータ(PRNG)クラスを次に示します。
2.4.7.1 oracle.security.crypto.core.RandomBitsSourceクラスの使用方法
RandomBitsSource
は、安全なPRNG実装を表す抽象クラスです。PRNGの性質に基づき、出力のセキュリティは、使用されるシード・エントロピの量と質によることに注意してください。適切な初期化と使用方法については、クラスを実装した際にガイダンスが示されます。RandomBitsSource
を拡張した具体クラスは、MD5RandomBitsSource
、SHA1RandomBitsSource
およびDSARandomBitsSource
クラスです。
新しいRandomBitsSource
インスタンスを作成するために、次のように、デフォルトのPRNGを返す、静的なgetDefault()
メソッドをコールします。
RandomBitsSource rbs = RandomBitsSource.getDefault();
RandomBitsSource
オブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。
RandomBitsSource rbs = new SHA1RandomBitsSource();
デフォルトでは、新たにサブクラスから作成されるPRNGが組み込まれます。汎用のRandomBitsSource
オブジェクトを組み込むには、バイト配列またはEntropySource
オブジェクトを使用して、いずれかのseedメソッドを使用します。
rbs.seed(myByteArray);
これで、オブジェクトが乱数を生成する準備ができました。
rbs.randomBytes(myRandomByteArray);
2.4.7.2 oracle.security.crypto.core.EntropySourceクラスの使用方法
EntropySource
クラスでは、PRNGのシード・マテリアルのソースが提供されます。EntropySource
を拡張した具体クラスは、SpinnerEntropySource
およびSREntropySource
クラスです。
新しいEntropySource
インスタンスを作成するために、次のように、デフォルトのエントロピ・ソースを返す静的なgetDefault()
メソッドをコールします。
EntropySource es = EntropySource.getDefault();
EntropySource
オブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。
EntropySource rbs = new SpinnerEntropySource();
次のようにgenerateByte
メソッドの1つを使用することで、エントロピ・ソースを使用する準備ができます。
es.generateBytes(mySeedingArray);
2.5 Oracle CryptoおよびCrypto FIPSのJava APIリファレンス
Oracle CryptoおよびOracle Crypto FIPSのクラスとメソッドについては、『Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス』を参照してください。
このガイドには、次のリンクからアクセスできます。
Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス