2017-05-28 23 views
0

私はAESカスタムパスワードの暗号化を実装しようとしており、以下のコードを理解したいと思います。AESカスタムパスワードキー

秘密鍵を256ビットとして生成すると想定される「PBKDF2WithHmacSHA256」を使用した場合、鍵サイズ256を指定する必要があるのはなぜか分かりません。「PBEKeySpec(password、salt、65536,256) 。

パスワード+ saltを使用してキーを生成した後、なぜそれをAESアルゴリズムとしてSecretKeySpecに関連付ける必要がありますか。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); 
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256); 
SecretKey tmp = factory.generateSecret(spec); 
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 
+0

明確にするには、パスワードを使用して他のデータを暗号化するために使用されるキーを派生させるためにパスワードを使用するパスワードベースの暗号化について質問しています。 –

+0

@ArtjomB。はい。私はパスワードベースの暗号化を実装しようとしています。私は別の問題がデータを暗号化するために使用されるこの "パスワード"を暗号化することだと思う。 – youcanlearnanything

答えて

3

なぜキーのサイズを指定する必要が256

ありPBKDF2は、柔軟なパスワードベースのキー派生関数です。これは、多くの反復を伴う基本的なハッシュ関数を使用します。任意のサイズのキーを出力できます。 SHA-256は壊れていないことが知られており、MD5やSHA-512(x64のみ)などの他のハッシュ関数に比べて比較的遅いため、AES-128キーを生成する場合でもSHA-256を使用するのが一般的です。遅さはPBKDFの重要な要素です。攻撃者がパスワードをブルートフォースしようとすると、攻撃者に直接影響するためです。もちろん、調整可能な反復回数もあります。

さらに、PBKDF2は、基本となるハッシュ関数の出力サイズよりもさらに重要なキーマテリアルを出力できます。たとえば、PBKDF2の出力にIVを含めるよう要求するのが一般的です。あなたの場合、出力は384ビット長でなければなりません。

一般的に、PBKDF2の基礎となるハッシュ関数以上を要求することは推奨されません。 IVを派生させたい場合は、use SHA-512にする必要があります。塩が各暗号化のためにランダムに生成され、暗号文とともに格納される限り、これは意味安全性を達成するのに十分でなければならない。

あなたの質問に答えるために、PBKDF2はどのように出力を使用したいのか分かりません。あなたはその責任を負っています。あなたはあなたがしていることを知る必要があります。 PBKDFの何かを暗号化する方法は数百万もあります。

なぜ私はAESアルゴリズムとしてSecretKeySpecに関連付ける必要がありますか。

あなたがCipherインスタンスを使用してAESで何かを暗号化したい場合は、実行時にAESに解決されますjava.security.Keyオブジェクトに渡す必要があります。そのためにKey#getAlgorithm()メソッドが使用されています。 SecretKeySpecを作成するときに"AES"を指定しないと、InvalidKeyExceptionが表示されます。

+0

暗号化のためにAESキーが必要だった場合、KeyGenerator.getInstance( "AES")よりもKeyGenerator.getInstance( "HmacSHA256")を考慮することができますか?そして、kgen.init(128)で。 128ビットまたは256ビットのキーが必要かどうかを示すことができます。 – youcanlearnanything

+0

HMACキーはPBKDF2の出力とは異なります。しかし、HMACとAESはキーに特定の内部構造を持たせる必要がないので、HMACキーを生成してAESキーとして使用することができます。問題は、なぜあなたはそれをやるのだろうか?コードの読みやすさとわかりやすさのためには本当に悪いです。 –