ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Security Developer Toolsによるセキュアなアプリケーションの開発
11gリリース1 (11.1.1)
B61386-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 Oracle Crypto

この章では、Oracle CryptoのSoftware Development Kit (SDK)の使用について説明します。Java開発者は、Oracle Cryptoを使用して、データのセキュリティと整合性を確保するアプリケーションを作成できます。


注意:

Oracle AS 11gリリース1以降では、Oracle Cryptoライブラリの使用はお薦めしません。かわりに、すべての暗号化操作に対して標準のJCEインタフェースを使用します。

ただし、ASN.1の解析については、そのタスクに対応するJDKの標準APIがないため、Oracle Cryptoライブラリを継続して使用する必要があります。

詳細は次の情報を参照してください。


この章に含まれる内容は次のとおりです。

3.1 Oracle Cryptoの機能と利点

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オブジェクトの構築および解析のためのメソッド。

3.1.1 Oracle Cryptoのパッケージ

Oracle Cryptoには次のパッケージが含まれます。

  • oracle.security.crypto.core - 基本暗号化プリミティブ

  • oracle.security.crypto.core.math - 数学関数を処理するユーティリティ・クラス

  • oracle.security.crypto.util - 様々なユーティリティ・クラス

  • oracle.security.crypto.asn1 - BERエンコードおよびDERエンコードのASN.1構造体の読取りと書込みのための機能

3.2 Oracle Cryptoの環境設定

この項では、Oracle Cryptoを使用するための環境設定について説明します。この章の内容は、次のとおりです。

3.2.1 Oracle Cryptoのシステム要件

Oracle Crypto SDKを使用するには、システムにJava Development Kit (JDK)バージョン1.6以上が必要です。

3.2.2 CLASSPATH環境変数の設定

CLASSPATH環境変数には、必要なjarファイルおよびclassファイルのフルパスとファイル名を指定してください。osdt_core.jarファイルがCLASSPATHにあることを確認します。

3.2.2.1 WindowsでのCLASSPATHの設定

WindowsでCLASSPATHを設定する手順を次に示します。

  1. Windowsの「コントロール パネル」で「システム」を選択します。

  2. 「システムのプロパティ」ダイアログで「詳細設定」タブを選択します。

  3. 「環境変数」をクリックします。

  4. ユーザー環境変数のセクションで「新規」をクリックし、CLASSPATH環境変数をユーザー・プロファイルに追加します。CLASSPATH環境変数がすでに存在している場合は、選択して「編集」をクリックします。

  5. 必要なjarファイルおよびclassファイルすべてのフルパスとファイル名をCLASSPATHに追加します。

    たとえば、CLASSPATHは次のようになります。

    %ORACLE_HOME%\modules\oracle.osdt_11.1.1\osdt_core.jar
    
  6. 「OK」をクリックします。

3.2.2.2 UNIXでのCLASSPATHの設定

UNIXでは、必要なjarファイルおよびclassファイルすべてのフルパスとファイル名を含むようにCLASSPATH環境変数を設定します。次に例を示します。

setenv CLASSPATH $CLASSPATH:$ORACLE_HOME/modules/oracle.osdt_11.1.1/osdt_core.jar

3.3 コア・クラスとインタフェース

この項では、Oracle Cryptoのコア・クラスとインタフェースの使用について説明し、コード例を示します。コア・クラスとインタフェースは、次のように分類されます。

3.3.1 キー・クラスおよびインタフェースについて

Oracle Cryptoでは、鍵の処理のために次のクラスとインタフェースが提供されます。

3.3.1.1 oracle.security.crypto.core.Keyインタフェースについて

このインタフェースは鍵を表しており、暗号化または復号化、デジタル署名の生成または検証、MACの生成または検証に使用できます。鍵は、秘密鍵、公開鍵または対称鍵です。

3.3.1.2 oracle.security.crypto.core.PrivateKeyインタフェースについて

このインタフェースは秘密鍵を表します。これは、暗号化された秘密鍵を保持するRSAPrivateKeyDSAPrivateKeyDHPrivateKeyECPrivateKeyまたはPrivateKeyPKCS8インスタンスです。

3.3.1.3 oracle.security.crypto.core.PublicKeyインタフェースについて

このインタフェースは公開鍵を表します。これは、RSAPublicKeyDSAPublicKeyDHPublicKeyまたはECPublicKeyインスタンスです。

3.3.1.4 oracle.security.crypto.core.SymmetricKeyクラスについて

このクラスは対称鍵を表します。これは、暗号化、復号化またはMAC操作で使用できます。

3.3.2 鍵および鍵ペアの生成

Oracle Cryptoでは、鍵生成のために次のクラスが提供されます。

3.3.2.1 oracle.security.crypto.core.KeyPairGeneratorクラスの使用方法

この抽象クラスは、RSA、DSA、Diffie-HellmanまたはECDSAなどの鍵ペアを生成するために使用されます。

新しい鍵ペア・ジェネレータを取得するには、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールし、新しいKeyPairGeneratorインスタンスを作成します。例3-1に、新しいKeyPairGeneratorインスタンスを作成する方法を示します。

例3-1 新しいKeyPairGeneratorインスタンスを作成するコード例

KeyPairGenerator kpg = KeyPairGenerator.getInstance(AlgID.rsaEncryption);

これにより、具体クラスRSAKeyPairGeneratorDSAKeyPairGeneratorDHKeyPairGeneratorまたは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();

3.3.2.2 oracle.security.crypto.core.SymmetricKeyGeneratorクラスの使用方法

このクラスでは、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に、対称鍵ペアを生成して保存する方法を示します。

例3-5 対称鍵を生成して保存するコード例

SymmetricKey sk = skg.generateKey();

FileOutputStream symKeyFos = 
    new FileOutputStream("my-sym-key.der");
symKeyFos.write(sk.getEncoded());
symKeyFos.close();

3.3.3 暗号の使用

Oracle Cryptoの暗号のクラスとインタフェースは、次のように分類されます。

3.3.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()メソッドをコールします。

例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);

3.3.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()メソッドをコールします。例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インタフェースにあるデフォルトのオブジェクトを使用します。

3.3.3.3 パスワード・ベース暗号化の使用

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オブジェクトを構築します。

例3-9 PBEオブジェクトを作成するコード例

PBEAlgorithmIdentifier pbeAlgID = 
    new PBEAlgorithmIdentifier(PBEAlgorithmIdentifier.pbeWithMD5AndDES_CBC, salt, 1024);
pbeEnc.initialize(pbeAlgID);
PBE pbeDec = PBE.getInstance(pbeAlgID);

3.3.4 署名アルゴリズムの使用

oracle.security.crypto.core.Signature抽象クラスでは、署名や署名の検証を行うメソッドが提供されます。Signatureクラスを拡張した具体クラスは、RSAMDSignatureDSAおよびECDSAクラスです。

署名の操作に使用できるアルゴリズムを次に示します。

  • RSAの場合: AlgID.md2WithRSAEncryptionAlgID.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に、秘密鍵を使用して署名を計算し、公開鍵と署名バイトを使用して署名を検証する方法を示します。

例3-12 署名を計算または検証するコード例

byte[] sigBytes = rsaSign.sign();
boolean verified = rsaVerif.verify(sigBytes);

3.3.5 メッセージ・ダイジェストの使用

Oracle Cryptoでは、次のメッセージ・ダイジェスト・クラスが提供されます。

3.3.5.1 oracle.security.crypto.core.MessageDigestクラスの使用方法

MessageDigest抽象クラスでは、データのハッシュとダイジェストのメソッドが提供されます。MessageDigestクラスを拡張した具体クラスは、MD2MD4MD5およびSHAクラスです。

メッセージ・ダイジェスト操作に使用できるアルゴリズムは、AlgID.md2AlgID.md4AlgID.md5AlgID.sha_1AlgID.sha_256AlgID.sha_384AlgID.sha_512です。

メッセージ・ダイジェストを作成する基本的なプロセスを次に示します。

  1. 新しいMessageDigestインスタンスを作成するために、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

  2. ダイジェストするデータを追加します。

  3. ハッシュ値を計算します。

例3-13に、MD5メッセージ・ダイジェスト・オブジェクトを作成する方法を示します。

例3-13 メッセージ・ダイジェストを作成するコード例

//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();

3.3.5.2 oracle.security.crypto.core.MACクラスの使用方法

MAC抽象クラスでは、メッセージ認証コード(MAC)の計算と検証のためのメソッドが提供されますMACを拡張した具体クラスはHMACクラスです。

MACの操作に使用できるアルゴリズムは、AlgID.hmacMD5およびAlgID.hmacSHAです。

MACを作成する基本的なプロセスを次に示します。

  1. 新しいMACインスタンスを作成するために、AlgorithmIdentifierオブジェクトおよびSymmetricKeyオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

  2. ダイジェストするデータを追加します。

  3. 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);

3.3.6 鍵合意スキームの使用

oracle.security.crypto.core.KeyAgreement抽象クラスでは、公開鍵合意スキーム(Diffie-Hellmanなど)のためのメソッドが提供されます。KeyAgreementクラスを拡張した具体クラスは、DHKeyAgreementおよびECDHKeyAgreementクラスです。

鍵合意の操作に使用できるアルゴリズムは、AlgID.dhKeyAgreementおよびECDHKeyAgreement(楕円曲線Diffie-Hellman鍵合意)です。

鍵合意の基本的なプロセスを次に示します。

  1. 新しいKeyAgreementインスタンスを作成するために、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。

  2. ローカルの秘密鍵と相手の公開鍵を設定します。

  3. 共有秘密値を計算します。

例3-15に、鍵合意を実行する方法を示します。

例3-15 鍵合意のコード例

//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();

3.3.7 擬似乱数ジェネレータの使用方法

暗号化では、乱数は鍵を生成するために使用されます。暗号化システムでは、攻撃側から推測できないように、暗号の強度が高い(疑似)乱数が必要です。

Oracle Cryptoでは、次の疑似乱数ジェネレータ(PRNG)クラスが提供されます。

3.3.7.1 oracle.security.crypto.core.RandomBitsSourceクラスの使用方法

RandomBitsSourceは、安全なPRNG実装を表す抽象クラスです。PRNGの性質に基づき、出力のセキュリティは、使用されるシード・エントロピの量と質によることに注意してください。適切な初期化と使用方法については、クラスを実装した際にガイダンスが示されます。RandomBitsSourceを拡張した具体クラスは、MD5RandomBitsSourceSHA1RandomBitsSourceおよびDSARandomBitsSourceクラスです。

新しいRandomBitsSourceインスタンスを作成するために、次のように、デフォルトのPRNGを返す、静的なgetDefault()メソッドをコールします。

RandomBitsSource rbs = RandomBitsSource.getDefault();

RandomBitsSourceオブジェクトは、次のようにサブクラスの1つをインスタンス化して作成することもできます。

RandomBitsSource rbs = new SHA1RandomBitsSource();

デフォルトでは、新たにサブクラスから作成されるPRNGが組み込まれます。汎用のRandomBitsSourceオブジェクトを組み込むには、バイト配列またはEntropySourceオブジェクトを使用して、いずれかのseedメソッドを使用します。

rbs.seed(myByteArray);

これで、オブジェクトが乱数を生成する準備ができました。

rbs.randomBytes(myRandomByteArray);

3.3.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);

3.4 Oracle CryptoおよびCrypto FIPSのJava APIリファレンス

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』