AES-256 でファイルを暗号化するキーを生成するPBKDF2の実装を作成しようとしていますが、salt サイズについて質問があります。SHA-256 を使用し、パスフレーズと連結する予定です。連結されたビット文字列のサイズが 256 ビットを超える場合に違いはありますか、それともソルトとパスフレーズの両方がそれぞれ 256 ビットである場合、より安全であると見なされますか?それらの連結を512ビットにしますか?
1 に答える
まず、PBKDF2 をバックアップして簡単に確認しましょう。
PBKDF2 は、必要なバイト数の出力を生成します。これらのバイトは、多数の「ブロック」を計算することによって生成されます。各ブロックは、選択したハッシュのサイズです。たとえば、長さが 64 バイトのキーを取得し、32 バイトのハッシュを生成する SHA-256 を使用する場合、2 つの PBKDF2 ブロックを生成します。最終的な出力は、これらのブロックの連結です。
では、各ブロックをどのように生成するのでしょうか?
そうですね (ここでは RFC 命名法を使用します)、ブロックは関数によって生成されますF
。この関数は、ユーザーの password P
、あなたの salt S
、必要な反復回数c
、および生成しているブロックのインデックスi
(1 ベース) を受け取ります。
最初のブロックでは、関数呼び出しは次のようになり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 を最初に生成することによって機能します。次に、関数は (回) 反復し、結果を前の結果と XOR します。各反復では、(再び) SHA-256 HMAC を使用してパスワードをハッシュしますが、前の結果を HMAC キーとして使用します。S
i
c
P
質問に戻りますが、HMAC を使用しているため、salt の長さは問題ではなく**、256 ビットを超える可能性があります。ハッシュ出力の長さよりも長いキー (この場合はパスワード) が HMAC に提供されると、キーをハッシュして正確に 256 ビットを取得します。256 ビットより短いキーが指定された場合、正確に 256 ビットになるようにパディングされます。ある意味では、これらの詳細は実装から隠されているため、PBKDF2 に渡すソルトの長さについて心配する必要はありません。
** まあ、それはある程度重要です。他の回答に関するフクロウのコメントを参照してください。レインボー テーブルの使用をイライラさせるのに十分な長さにする必要があります。(ただし、PBKDF2 はハッシュ関数を何度も適用するため、長いソルトは従来の「ストレート ハッシュ」アプリケーションほど重要ではありません。) 私のアプリケーションでは、32 バイトのランダム ソルトを使用しています。 PBKDF2 でパスワードをハッシュします。
それが役立つことを願っています!