ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Security Developer Toolsによるアプリケーションの開発
12c (12.2.1)
E72521-01
  目次へ移動
目次

前
次
 

2 Oracle Crypto

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

注意:

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

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

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

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

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

2.2 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構造体の読取りと書込みのための機能

2.3 Oracle Cryptoの環境設定

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

2.4 Oracle Cryptoのコア・クラスとインタフェースの理解および使用方法

この項では、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インタフェース

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

2.4.1.3 oracle.security.crypto.core.PublicKeyインタフェース

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

2.4.1.4 oracle.security.crypto.core.SymmetricKeyクラス

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

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

これにより、具体クラスRSAKeyPairGeneratorDSAKeyPairGeneratorDHKeyPairGeneratorまたは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の暗号のコア・クラスとインタフェースは、次のように分類されます。

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クラスを拡張した具体クラスは、RSAMDSignatureDSAおよびECDSAクラスです。

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

  • RSAの場合: AlgID.md2WithRSAEncryptionAlgID.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);

2.4.5 Oracle Cryptoのメッセージ・ダイジェスト・クラスの使用

この項では、Oracle Cryptoで使用できるメッセージ・ダイジェスト・クラスについて説明します。

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

2.4.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. ハッシュ値を計算します。

次の例に、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();

2.4.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値を計算して検証します。

次の例に、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鍵合意)です。

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

  1. 新しいKeyAgreementインスタンスを作成するために、AlgorithmIdentifierオブジェクトをパラメータとして、静的なgetInstance()メソッドをコールします。
  2. ローカルの秘密鍵と相手の公開鍵を設定します。
  3. 共有秘密値を計算します。

次の例に、鍵合意を実行する方法を示します。

//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)クラスが提供されます。

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

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のクラスおよびメソッドは次のAPIリファレンス(Javadoc)で参照できます。

Oracle Fusion Middleware Oracle Security Developer Tools Java APIリファレンス