2017-06-06 17 views
-1

私はPBKDF2でキーを生成するためにこのコードスニペットを持っています。PBKDF2 - SHA512で1024ビットの鍵長を生成するとどうなりますか?

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); 
     PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), iterations, length); 
     SecretKey key = skf.generateSecret(spec); 
     byte[] res = key.getEncoded(); 

キーの長さが指定されたSHAダイジェストアルゴリズムの種類よりも長い場合、どのように生成されるのだろうか?

たとえば、キーの長さを1024ビットに設定し、アルゴリズムPBKDF2WithHmacSHA512を使用するとどうなりますか? 512ビットはどこで生成されますか?次のようにPBKDF2

dkLen is the desired length of the derived key 
DK is the generated derived key 

当たり

+1

PBKDF2アルゴリズムの内部動作とストレッチの仕組みについて質問していますか? –

+0

https://tools.ietf.org/html/rfc2898#section-5.2しかし、256ビットを超えるキー素材を使用する任意の(単一の)対称アルゴリズムは非常識です –

+0

@ dave_thompson_085これより長い出力を提供することが望ましいかもしれませんワンショットのキーとIVの両方 – zaph

答えて

3

一般的には、ハッシュ長以上を求めることをお勧めされていない。

(PKCS#5よりも多少読みやすいフォーマットを有する)ウィキペディアによると:

DK = T1 || T2 || ... || Tdklen/hlen 
Ti = F(Password, Salt, c, i) 
ここ

c方法によって反復回数です。

この問題は、一般にの結果が複数のコンポーネントに分割されている場合にのみ使用されます。また、攻撃者が最初の128ビットのみを使用して良いパスワード推測を検証できる場合、攻撃者はアルゴリズムの正当なユーザーよりも少ない労力を費やす必要があります。

これを解決する1つの方法は、異なるラベル(ハッシュされた情報)を使用してHKDFなどのKBKDFを使用してPBKDF2の出力を分割することです。そうすれば、各512ビットのすべての反復を実行することなく、ほぼ無限の量の鍵素材を生成することができます。

非常にセキュアなAES-256ビットキーの場合、512ビットで十分であることに注意してください。 SHA-512をPBKDF2に使用する理由はこれだけです。 64ビットマシンではSHA-512はSHA-256よりも速くであり、より多くの出力マテリアルとセキュリティを提供します。

2

hLenが導出鍵DKTiブロックビットの足し、計算される。

DK = T1 || T2 || ... || Tdklen/hlen 

由来のバイト配列はハッシュに基づいていない任意の長さであることができますアルゴリズム。各ブロックは再びすべての反復を介して実行される

関連する問題