2011-07-13 27 views
2

AES-256でファイルを暗号化するための鍵を生成するためにPBKDF2の実装を作成しようとしていますが、塩のサイズに関する質問があります。私はSHA-256を使用してパスフレーズと連結する予定です。連結ビット列のサイズが256ビットより大きい場合、あるいは塩とパスフレーズの両方がそれぞれ256ビットの場合はより安全と考えられますが、それらの連結を512ビットにするか?ハッシュ関数でビット文字列のサイズが重要ですか?

答えて

1

まずは、バックアップと迅速PBKDF2を見直してみましょう:

PBKDF2は長いバイトの所望の数である出力を生成します。いくつかの 'ブロック'を計算することによって、これらのバイトを生成します。各ブロックは、選択されたハッシュのサイズです。たとえば、64バイトの長さのキーを派生させ、32バイトのハッシュを生成するSHA-256を使用する場合は、2つのPBKDF2ブロックを生成します。最終出力は、これらのブロックの連結です。

どのように各ブロックを生成するのですか?

ここでRFC命名法を使用します。ブロックは関数Fによって生成されます。この関数は、ユーザーパスワードP、塩分S、希望反復回数c、および生成するブロックのインデックスi(1ベース)を受け取ります。あなたの最初のブロックのために

、あなたの関数の呼び出しは次のようになります:(。私は100kの反復を使用しています注意してください、この値を選択する方法の詳細については、this postを参照してください。)F ("MySecretPassword", "random_salt", 100000, 1)

をRFCに戻っ:

F(P, S, c, i) = U_1 \xor U_2 \xor U_3 ... U_c 
U_1 = PRF(P, S || INT(i)) 
U_2 = PRF(P, U_1) 
U_3 = PRF(P, U_2) 
... 
U_c = PRF(P, U_{c-1}) 

PRFは、擬似ランダム関数の略です。 SHA-256は、SHA-256ベースのHMACでなければなりません。この関数は、最初にパスワードPのSHA-256 HMACを生成し、ブロック番号iと連結した塩Sを使用して動作します。次に、関数は(c回)反復し、その結果をXORします。各反復では、SHA-256 HMAC(再び)を使用してパスワードPをハッシュしますが、前の結果をHMACキーとして使用します。

あなたの質問に戻るには - HMACを使用しているため、塩の長さは重要ではありません**、256ビット以上になる可能性があります。 HMACにハッシュ出力の長さよりも長いキー(この場合はパスワード)が入力されると、キーをハッシュして正確に256ビットを取得します。 256ビットより短いキーが供給された場合、それは正確に256ビットを得るために埋め込まれます。ある意味では、これらの詳細は実装から隠されているので、PBKDF2に渡す塩の長さを心配する必要はありません。

**まあ、それはです。ある程度は関係ありません。他の答えについては、owlsteadのコメントを参照してください。それは、虹のテーブルの使用を挫折させるのに十分長いはずです。 (PBKDF2はあなたのハッシュ関数を多数回適用するので、長い塩は従来の「ストレートハッシュ」アプリケーションよりも重要ではありません)。私のアプリケーションでは、32バイトのランダムな塩を使用します。パスワードをPBKDF2でハッシュします。

希望に役立ちます!

+0

HMACハッシュが標準ハッシュよりも正確に必要なのはなぜですか?なぜ、HMAC関数のキーとして使用するのではなく、以前の結果を単純なsaltとしてパスワードに使用するのは安全ではないでしょうか? –

+0

+1、ただ1つの小さな事柄、再びPKCS#5: "擬似乱数関数PRFの第1引数はHMACの"キー "として機能し、第2引数はHMACの"テキスト "として機能します。PBKDF2の場合、パスワードであり、 "テキスト"は塩です。 " – emboss

+0

@emboss - ああ、あなたは正しいです、私は上記のテキストを更新しました。 – Tails

関連する問題