Oracle® Fusion Middleware Oracle Security Developer Toolsによるアプリケーションの開発 12c (12.2.1.2) E82830-01 |
|
前 |
次 |
Java開発者は、Oracle Crypto Software Development Kit (SDK)を使用して、データのセキュリティと整合性を確保するアプリケーションを作成できます。
注意:
リリース11gR1以降では、Oracle Cryptoライブラリの使用はお薦めしません。かわりに、すべての暗号化操作に対して標準のJCEインタフェースを使用します。
ただし、ASN.1の解析については、そのタスクに対応するJDKの標準APIがないため、Oracle Cryptoライブラリを継続して使用する必要があります。
詳細は次の情報を参照してください。
この章のトピックは、次のとおりです:
Oracle Cryptoでは、公開鍵暗号化アルゴリズム、デジタル署名アルゴリズム、鍵交換アルゴリズム、対称暗号化アルゴリズム、メッセージ・ダイジェスト・アルゴリズム、MACアルゴリズム、およびASN.1オブジェクトの構築と解析のためのメソッドがサポートされています。
Oracle Cryptoでは次の機能が提供されます。
公開鍵暗号化。RSAなど。
デジタル署名アルゴリズム。DSA、RSAなど。
鍵交換アルゴリズム。Diffie-Hellmanなど。
対称暗号化アルゴリズム。Blowfish、AES、DES、3DES、RC2、RC4など。
メッセージ・ダイジェスト・アルゴリズム。MD2、MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512など。
MACアルゴリズム。HMAC-MD5、HMAC-SHA-1など。
ASN.1オブジェクトの構築および解析のためのメソッド。
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構造体の読取りと書込みのための機能
Oracle Crypto SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。CLASSPATH
環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。
osdt_core.jar
ファイルがCLASSPATH
にあることを確認します。
たとえば、CLASSPATH
は次のようになります。
%ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar
関連項目:
Oracle Cryptoは複数のコア・クラスとインタフェースで構成されます。これらは、鍵クラス、鍵生成クラス、Cipherクラス、署名クラス、メッセージ・ダイジェスト・クラス、鍵合意クラスおよび擬似乱数ジェネレータ・クラスに分類されます。
この項では、Oracle Cryptoのコア・クラスとインタフェースの使用について説明し、コード例を示します。次の各項で、さらに詳しく説明します。
Oracle Cryptoでは、鍵の処理のために複数のクラスとインタフェースが提供されます。
これらのクラスとインタフェースを次に示します。
このインタフェースは鍵を表しており、暗号化または復号化、デジタル署名の生成または検証、MACの生成または検証に使用できます。鍵は、秘密鍵、公開鍵または対称鍵です。
このインタフェースは秘密鍵を表します。これは、暗号化された秘密鍵を保持するRSAPrivateKey
、DSAPrivateKey
、DHPrivateKey
、ECPrivateKey
またはPrivateKeyPKCS8
インスタンスです。
このインタフェースは公開鍵を表します。これは、RSAPublicKey
、DSAPublicKey
、DHPublicKey
またはECPublicKey
インスタンスです。
Oracle Cryptoでは、鍵を生成するためのクラスが提供されます。
これらのクラスを次に示します。
この抽象クラスは、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();
このクラスでは、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();
Oracle Cryptoでは、対象暗号のクラス、RSA暗号のクラス、およびパスワード・ベース暗号化のメソッドが提供されます。
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()
メソッドをコールします。
次の例に、新しい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);
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
インタフェースにあるデフォルトのオブジェクトを使用します。
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);
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()
メソッドをコールします。次の例に、新しいSignature
オブジェクトを作成し、指定したアルゴリズムで初期化する方法を示します。
Signature rsaSign = Signature.getInstance(AlgID.md5WithRSAEncryption); Signature rsaVerif = Signature.getInstance(AlgID.md5WithRSAEncryption);
次の例に、Signature
オブジェクトの鍵、および署名または検証する文書を設定する方法を示します。
rsaSign.setPrivateKey(privKey); rsaSign.setDocument(data); rsaVerif.setPublicKey(pubKey); rsaVerif.setDocument(data);
次の例に、秘密鍵を使用して署名を計算し、公開鍵と署名バイトを使用して署名を検証する方法を示します。
byte[] sigBytes = rsaSign.sign(); boolean verified = rsaVerif.verify(sigBytes);
Oracle Cryptoには、データのハッシング、ダイジェストおよび計算を行うためのメッセージ・ダイジェスト・クラスが含まれています。
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()
メソッドをコールします。 次の例に、MD5メッセージ・ダイジェスト・オブジェクトを作成する方法を示します。
//Create a new MD5 MessageDigest object MessageDigest md5 = Signature.getInstance(AlgID.md5); //Add the data to be digested md5.udpate(data1); md5.udpate(data2); //Compute the hash value md5.computeCurrent(); byte[] digestBits = md5.getDigestBits();
MAC
抽象クラスでは、メッセージ認証コード(MAC)の計算と検証のためのメソッドが提供されます。MAC
を拡張した具体クラスはHMAC
クラスです。
MACの操作に使用できるアルゴリズムは、AlgID.hmacMD5
およびAlgID.hmacSHA
です。
MACを作成する基本的なプロセスを次に示します。
MAC
インスタンスを作成するために、AlgorithmIdentifier
オブジェクトおよびSymmetricKey
オブジェクトをパラメータとして、静的なgetInstance()
メソッドをコールします。 次の例に、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);
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();
暗号化では、乱数は鍵を生成するために使用されます。暗号化システムでは、攻撃側から推測できないように、暗号の強度が高い(疑似)乱数が必要です。Oracle Cryptoでは、擬似乱数ジェネレータ(PRNG)クラスが提供されます。
これらの擬似乱数ジェネレータ(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);