Oracle® Fusion Middleware Oracle Security Developer Toolsによるセキュアなアプリケーションの開発 11gリリース1 (11.1.1) B61386-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle CryptoのSoftware Development Kit (SDK)の使用について説明します。Java開発者は、Oracle Cryptoを使用して、データのセキュリティと整合性を確保するアプリケーションを作成できます。
注意: Oracle AS 11gリリース1以降では、Oracle Cryptoライブラリの使用はお薦めしません。かわりに、すべての暗号化操作に対して標準のJCEインタフェースを使用します。ただし、ASN.1の解析については、そのタスクに対応するJDKの標準APIがないため、Oracle Cryptoライブラリを継続して使用する必要があります。 詳細は次の情報を参照してください。
|
この章に含まれる内容は次のとおりです。
この項では、Oracle Cryptoを使用するための環境設定について説明します。この章の内容は、次のとおりです。
Oracle Crypto SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。
CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。osdt_core.jar
ファイルがCLASSPATH
にあることを確認します。
WindowsでCLASSPATH
を設定する手順を次に示します。
Windowsの「コントロール パネル」で「システム」を選択します。
「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。
「環境変数」をクリックします。
ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH
環境変数をユーザー・プロファイルに追加します。CLASSPATH
環境変数がすでに存在している場合は、選択して「編集」をクリックします。
必要なjarファイルおよびclassファイルすべてのフルパスとファイル名をCLASSPATH
に追加します。
たとえば、CLASSPATH
は次のようになります。
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar
「OK」をクリックします。
この項では、Oracle Cryptoのコア・クラスとインタフェースの使用について説明し、コード例を示します。コア・クラスとインタフェースは、次のように分類されます。
Oracle Cryptoでは、鍵の処理のために次のクラスとインタフェースが提供されます。
このインタフェースは鍵を表しており、暗号化または復号化、デジタル署名の生成または検証、MACの生成または検証に使用できます。鍵は、秘密鍵、公開鍵または対称鍵です。
このインタフェースは秘密鍵を表します。これは、暗号化された秘密鍵を保持するRSAPrivateKey
、DSAPrivateKey
、DHPrivateKey
、ECPrivateKey
またはPrivateKeyPKCS8
インスタンスです。
このインタフェースは公開鍵を表します。これは、RSAPublicKey
、DSAPublicKey
、DHPublicKey
またはECPublicKey
インスタンスです。
このクラスは対称鍵を表します。これは、暗号化、復号化またはMAC操作で使用できます。
Oracle Cryptoでは、鍵生成のために次のクラスが提供されます。
この抽象クラスは、RSA、DSA、Diffie-HellmanまたはECDSAなどの鍵ペアを生成するために使用されます。
新しい鍵ペア・ジェネレータを取得するには、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールし、新しいKeyPairGenerator
インスタンスを作成します。例3-1に、新しいKeyPairGenerator
インスタンスを作成する方法を示します。
例3-1 新しいKeyPairGenerator
インスタンスを作成するコード例
KeyPairGenerator kpg = KeyPairGenerator.getInstance(AlgID.rsaEncryption);
これにより、具体クラスRSAKeyPairGenerator
、DSAKeyPairGenerator
、DHKeyPairGenerator
またはECKeyPairGenerator
の1つから、KeyPairGenerator
オブジェクトが作成されます。
いずれかのinitialize()
メソッドを使用して、鍵ペア・ジェネレータを初期化します。generateKeyPair()
メソッドを使用して、鍵ペアを生成します。例3-2に、鍵ペア・ジェネレータを初期化して鍵ペアを生成する方法を示します。
例3-2 初期化して鍵ペアを生成するコード例
kpg.initialize(1024, RandomBitsSource.getDefault()); KeyPair kp = kpg.generateKeyPair(); PrivateKey privKey = kp.getPrivate(); PublicKey pubKey = kp.getPublic();
output()
メソッドを使用して鍵を保存するか、秘密鍵の場合は、暗号化してからPrivateKeyPKCS8
クラスを使用して保存します。例3-3に、鍵ペアを保存する方法を示します。
例3-3 鍵ペアを保存するコード例
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();
このクラスでは、Blowfish、DES、3DES、RC4、RC2、AES、HMAC鍵などの対称鍵ペアが生成されます。
新しい対称鍵ジェネレータを取得するには、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールし、新しいSymmetricKeyGenerator
インスタンスを作成します。例3-4に、新しいSymmetricKeyGenerator
インスタンスを作成する方法を示します。
例3-4 新しいSymmetricKeyGenerator
インスタンスを作成するコード例
SymmetricKeyGenerator skg = SymmetricKeyGenerator.getInstance(AlgID.desCBC);
generateKey()
メソッドを使用して鍵ペアを生成します。次に、getEncoded()
メソッドを使用して鍵を保存します。例3-5に、対称鍵ペアを生成して保存する方法を示します。
Oracle Cryptoの暗号のクラスとインタフェースは、次のように分類されます。
対称暗号は、ブロック暗号(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()
メソッドをコールします。
例3-6に、新しいCipherインスタンスを作成する方法を示します。まず、RC4オブジェクトが作成され、指定した鍵で初期化されます。次に、ブロック暗号DESオブジェクトが作成され、指定した鍵と空白の埋込みで初期化されます。これで、暗号が作成され、渡したパラメータで初期化されます。既存の暗号を再度初期化するには、いずれかのinitialize()
メソッドをコールします。
例3-6 Cipher
インスタンスを作成するコード例
Cipher rc4 = Cipher.getInstance(AlgID.rc4, rc4SymKey); Cipher desCipher = Cipher.getInstance(AlgID.desCBC, desSymKey, Padding.PKCS5);
CBC暗号を使用する場合、AlgorithmIdentifier
オブジェクトは、RC2暗号の初期化ベクトル(IV)や有効な鍵の長さなどの、暗号化パラメータを保持することができます。ブロック暗号を作成または初期化する際に暗号化パラメータを指定するには、これらのパラメータを使用してCBCAlgorithmIdentifier
オブジェクトまたはRC2AlgorithmIdentifier
オブジェクトを構築します。例3-7に、CBC暗号とRC2暗号を作成して初期化する方法を示します。
例3-7 CBC暗号を作成して初期化するコード例
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);
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()
メソッドをコールします。例3-8に、RSApkcs1
オブジェクトを作成し、指定した鍵で初期化する方法を示します。この暗号はデータの暗号化または復号化に使用できます。
例3-8 RSA暗号を作成して初期化するコード例
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
インタフェースにあるデフォルトのオブジェクトを使用します。
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
オブジェクトを構築します。
oracle.security.crypto.core.Signature
抽象クラスでは、署名や署名の検証を行うメソッドが提供されます。Signature
クラスを拡張した具体クラスは、RSAMDSignature
、DSA
およびECDSA
クラスです。
RSAの場合: AlgID.md2WithRSAEncryption
、AlgID.md5WithRSAEncryption
およびAlgID.sha_1WithRSAEncryption
DSAの場合: AlgID.dsaWithSHA1
ECDSAの場合: AlgID.ecdsaWithSHA1
新しいSignature
インスタンスを作成するには、AlgorithmIdentifier
オブジェクトと、PrivateKey
オブジェクトまたはPublicKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。例3-10に、新しいSignature
オブジェクトを作成し、指定したアルゴリズムで初期化する方法を示します。
例3-10 新しいSignature
オブジェクトを作成するコード例
Signature rsaSign = Signature.getInstance(AlgID.md5WithRSAEncryption); Signature rsaVerif = Signature.getInstance(AlgID.md5WithRSAEncryption);
例3-11に、Signature
オブジェクトの鍵、および署名または検証する文書を設定する方法を示します。
例3-11 署名鍵および文書を設定するコード例
rsaSign.setPrivateKey(privKey); rsaSign.setDocument(data); rsaVerif.setPublicKey(pubKey); rsaVerif.setDocument(data);
例3-12に、秘密鍵を使用して署名を計算し、公開鍵と署名バイトを使用して署名を検証する方法を示します。
Oracle Cryptoでは、次のメッセージ・ダイジェスト・クラスが提供されます。
MessageDigest
抽象クラスでは、データのハッシュとダイジェストのメソッドが提供されます。MessageDigest
クラスを拡張した具体クラスは、MD2
、MD4
、MD5
およびSHA
クラスです。
メッセージ・ダイジェスト操作に使用できるアルゴリズムは、AlgID.md2
、AlgID.md4
、AlgID.md5
、AlgID.sha_1
、AlgID.sha_256
、AlgID.sha_384
、AlgID.sha_512
です。
メッセージ・ダイジェストを作成する基本的なプロセスを次に示します。
新しいMessageDigest
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。
ダイジェストするデータを追加します。
ハッシュ値を計算します。
例3-13に、MD5メッセージ・ダイジェスト・オブジェクトを作成する方法を示します。
MAC
抽象クラスでは、メッセージ認証コード(MAC)の計算と検証のためのメソッドが提供されます。MAC
を拡張した具体クラスはHMAC
クラスです。
MACの操作に使用できるアルゴリズムは、AlgID.hmacMD5
およびAlgID.hmacSHA
です。
MACを作成する基本的なプロセスを次に示します。
新しいMAC
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトおよびSymmetricKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。
ダイジェストするデータを追加します。
MAC値を計算して検証します。
例3-14に、HMAC-SHA1アルゴリズムを使用して、新しいHMACオブジェクトを作成する方法を示します。
例3-14 MACオブジェクトを作成するコード例
//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);
oracle.security.crypto.core.KeyAgreement
抽象クラスでは、公開鍵合意スキーム(Diffie-Hellmanなど)のためのメソッドが提供されます。KeyAgreement
クラスを拡張した具体クラスは、DHKeyAgreement
およびECDHKeyAgreement
クラスです。
鍵合意の操作に使用できるアルゴリズムは、AlgID.dhKeyAgreement
およびECDHKeyAgreement
(楕円曲線Diffie-Hellman鍵合意)です。
鍵合意の基本的なプロセスを次に示します。
新しいKeyAgreement
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。
ローカルの秘密鍵と相手の公開鍵を設定します。
共有秘密値を計算します。
例3-15に、鍵合意を実行する方法を示します。
暗号化では、乱数は鍵を生成するために使用されます。暗号化システムでは、攻撃側から推測できないように、暗号の強度が高い(疑似)乱数が必要です。
Oracle Cryptoでは、次の疑似乱数ジェネレータ(PRNG)クラスが提供されます。
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);
EntropySource
クラスでは、PRNGのシード・マテリアルのソースが提供されます。EntropySource
を拡張した具体クラスは、SpinnerEntropySource
およびSREntropySource
クラスです。
新しいEntropySource
インスタンスを作成するために、次のように、デフォルトのエントロピ・ソースを返す静的なgetDefault()
メソッドをコールします。
EntropySource es = EntropySource.getDefault();
EntropySource
オブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。
EntropySource rbs = new SpinnerEntropySource();
次のようにgenerateByte
メソッドの1つを使用することで、エントロピ・ソースを使用する準備ができます。
es.generateBytes(mySeedingArray);
Oracle CryptoのJava APIリファレンス(Javadoc)は次のドキュメントで参照できます。
Oracle Security Developer Tools Crypto Java API Reference
Oracle Crypto FIPSのJava APIリファレンス(Javadoc)は次のドキュメントで参照できます。
『Oracle Fusion Middleware Crypto FIPS Java API Reference for Oracle Security Developer Tools』