0
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(null, null);
SecretKey skInput = new SecretKeySpec("input".getBytes(), "DESede");
SecretKeyEntry skeInput = new KeyStore.SecretKeyEntry(skInput);
ks.setEntry("input_key", skeInput, new KeyStore.PasswordProtection("banana".toCharArray()));
FileOutputStream fos = new FileOutputStream("my.keystore");
pambks.store(fos, "password".toCharArray());
fos.flush();
fos.close();

上記のコードはinput、SecretKey にエンコードしてキーストアに格納しようとしています。以下に示すコードは、キーストアからキーを取得する方法です。しかし、元の値にデコードする方法がわかりませんか?

FileInputStream fin = new FileInputStream("my.keystore");
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(fin, "password".toCharArray());
SecretKeyEntry ske = (SecretKeyEntry) readks.getEntry("input_key", new KeyStore.PasswordProtection("banana".toCharArray()));
SecretKey sk = ske.getSecretKey();

これが SecretKey の暗号化と復号化を行う正しい方法かどうか確信が持てませんでした。間違っている場合は修正してください。

4

1 に答える 1

1

この Q/AI を読み返すと、私は質問を読み違えたと思います。

キーの getEncoded メソッドを呼び出すことで、キーのバイト表現を取得できます。その後、String コンストラクターの 1 つを使用してテキストに戻すことができます。前述のとおり、文字列をキーとして使用しないでください。DES キーは最後のビットにパリティが含まれているため、結果が変わる可能性があることに注意してください。キーに文字列を使用するには、16 進数を使用することをお勧めします。キーには十分なエントロピーが必要であり、文字列がそれを提供する可能性は低いことに注意してください。


上記のコードには、完全に正しくない点がいくつかあります。

  1. を (決して) 使用しないでください"input".getBytes()。まずgetBytes()、プラットフォーム固有のデフォルトの文字エンコーディングを使用します。DES キーを文字列として使用する場合は、16 進数のデコーダー (Apache Commons コーデックまたは Bouncy Castle など) でデコードします。

  2. DESede キーには 24 バイトを使用する必要があります。"input".getBytes()十分なバイトが返されません。

  3. DES 鍵のKeyFactory場合、パリティ ビットが設定されていることを確認するためだけに、鍵の仕様を if に渡すのが得策です。彼らは、キーが有効であることを確認します。

大量のキー データを取得するには、パスワードに PBKDF2 を使用するか、ランダムに生成されたキーを使用します。

暗号化されたキー ストアが暗号化されたキーに十分なストレージであるかどうかは、ユース ケースとその他のセキュリティ対策によって異なります。

于 2013-07-26T02:13:44.677 に答える