AES-256でファイルを暗号化するための鍵を生成するためにPBKDF2の実装を作成しようとしていますが、塩のサイズに関する質問があります。私はSHA-256を使用してパスフレーズと連結する予定です。連結ビット列のサイズが256ビットより大きい場合、あるいは塩とパスフレーズの両方がそれぞれ256ビットの場合はより安全と考えられますが、それらの連結を512ビットにするか?ハッシュ関数でビット文字列のサイズが重要ですか?
答えて
まずは、バックアップと迅速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でハッシュします。
希望に役立ちます!
- 1. .NET文字列ハッシュ関数は移植可能ですか?
- 2. 双方向文字列ハッシュ関数
- 3. 文字列から整数へのハッシュ関数の精度
- 4. ハッシュ関数をC++で文字列をintに変換する
- 5. ハッシュテーブルのサイズと重要なビット
- 6. C++文字列のハッシュが文字列またはメモリアドレスをハッシュしますか?
- 7. SHA1ハッシュ文字列を32ビット文字列に切り捨てる方法
- 8. (文字列)ハッシュ関数の乗数の選択
- 9. Java:ハッシュ関数が入力した文字列
- 10. ビットはエンディアンで重要ですか?
- 11. 文字列のビット数をカウントする
- 12. 文字のエスケープおよびハッシュ関数
- 13. 文字列のサイズをC++で文字数に制限する
- 14. 文字のサイズが8ビットしかないのはなぜですか?
- 15. 整数文字列値へのハッシュ
- 16. ブール値の大文字小文字は重要ですか?
- 17. Python関数の文字列関数ですか?
- 18. Globalize3の同じ文字列に重複する翻訳が必要ですか?
- 19. HiveのINSERT OVERWRITE文で列の順序が重要ですか?
- 20. psqlコマンドライン文字列の改行が重要なのはいつですか?
- 21. ハッシュ変換の文字列
- 22. SHA256キーのハッシュ文字列
- 23. Oracleのハッシュ文字列
- 24. MySQLでハッシュされた文字列
- 25. データベースフィールドのサイズは重要ですか?
- 26. Delphiには二重引用符文字列関数がありますか?
- 27. opensslのハッシュ関数の実装は、ビットまたはバイト指向ですか?
- 28. 要素タイプが無効です:文字列/クラス/関数がありますオブジェクト:
- 29. javaで文字列を返す関数
- 30. 文字列のサイズがメインと関数で異なるのはなぜですか?
HMACハッシュが標準ハッシュよりも正確に必要なのはなぜですか?なぜ、HMAC関数のキーとして使用するのではなく、以前の結果を単純なsaltとしてパスワードに使用するのは安全ではないでしょうか? –
+1、ただ1つの小さな事柄、再びPKCS#5: "擬似乱数関数PRFの第1引数はHMACの"キー "として機能し、第2引数はHMACの"テキスト "として機能します。PBKDF2の場合、パスワードであり、 "テキスト"は塩です。 " – emboss
@emboss - ああ、あなたは正しいです、私は上記のテキストを更新しました。 – Tails