Java-cryptography-retrieving-keys

提供:Dev Guides
移動先:案内検索

Java暗号化-キーの取得

In this chapter, we will learn how to retrieve a key from the keystore using Java Cryptography.

キーストアからキーを取得するには、以下の手順に従います。

ステップ1:KeyStoreオブジェクトを作成する

*java.security* パッケージの *KeyStore* クラスの* getInstance()*メソッドは、キーストアのタイプを表す文字列値を受け入れ、KeyStoreオブジェクトを返します。

以下に示すように、このメソッドを使用してKeyStoreクラスのオブジェクトを作成します。

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

ステップ2:KeyStoreオブジェクトをロードする

KeyStoreクラスの* load()メソッドは、キーストアファイルを表す *FileInputStream オブジェクトと、キーストアのパスワードを指定するStringパラメーターを受け入れます。

通常、キーストアは、 C:/Program Files/Java/jre1.8.0_101/lib/security/ の場所にある cacerts という名前のファイルに保存され、デフォルトのパスワードは changeit です。 * load()*メソッドを以下に示します。

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

ステップ3:KeyStore.ProtectionParameterオブジェクトを作成する

以下に示すように、KeyStore.ProtectionParameterをインスタンス化します。

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

ステップ4:SecretKeyオブジェクトを作成する

サブクラス SecretKeySpec をインスタンス化して、 SecretKey (インターフェイス)オブジェクトを作成します。 インスタンス化する際、以下に示すように、パスワードとアルゴリズムをコンストラクターにパラメーターとして渡す必要があります。

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

ステップ5:SecretKeyEntryオブジェクトを作成する

以下に示すように、上記の手順で作成した SecretKey オブジェクトを渡すことにより、 SecretKeyEntry クラスのオブジェクトを作成します。

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

ステップ6:エントリをキーストアに設定します

*KeyStore* クラスの* setEntry()*メソッドは、キーストアエントリエイリアス、 *SecretKeyEntry* オブジェクト、ProtectionParameterオブジェクトを表すStringパラメータを受け入れ、指定されたエイリアスの下にエントリを格納します。

以下に示す* setEntry()*メソッドを使用して、キーストアにエントリを設定します。

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

ステップ7:KeyStore.SecretKeyEntryオブジェクトを作成する

KeyStoreクラスの* getEntry()メソッドは、エイリアス(Stringパラメーター)およびProtectionParameterクラスのオブジェクトをパラメーターとして受け入れ、 *KeyStoreEntry オブジェクトを返します。これを KeyStore.SecretKeyEntry オブジェクトにキャストできます。

以下に示すように、必要なキーのエイリアスと前の手順で作成した保護パラメーターオブジェクトを* getEntry()*メソッドに渡すことにより、KeyStore.SecretKeyEntryクラスのオブジェクトを作成します。

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

ステップ8:取得したエントリのキーオブジェクトを作成する

*SecretKeyEntry* クラスの* getSecretKey()*メソッドは、SecretKeyオブジェクトを返します。 このメソッドを使用して、以下に示すようにSecretKeyオブジェクトを作成します。
//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();
System.out.println(mysecretKey);

次の例は、キーストアからキーを取得する方法を示しています。 ここでは、「cacerts」ファイル(windows 10オペレーティングシステム)にあるキーストアにキーを保存し、それを取得して、キーの生成に使用されるアルゴリズムや、取得したキー。

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class RetrievingFromKeyStore{
   public static void main(String args[]) throws Exception{
     //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

     //Loading the the KeyStore object
      char[] password = "changeit".toCharArray();
      java.io.FileInputStream fis = new FileInputStream(
         "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");

      keyStore.load(fis, password);

     //Creating the KeyStore.ProtectionParameter object
      ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

     //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");

     //Creating SecretKeyEntry object
      SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

     //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);

     //Creating the KeyStore.SecretKeyEntry object
      SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

     //Creating SecretKey object
      SecretKey mysecretKey = secretKeyEnt.getSecretKey();
      System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());
      System.out.println("Format used for the key: "+mysecretKey.getFormat());
   }
}

出力

上記のプログラムは、次の出力を生成します-

Algorithm used to generate key: DSA
Format of the key: RAW