この質問 から、ユーザーの入力されたパスワードを取得し、BCryptを介して実行し、次にSHA256を介してthatを実行して、256ビットのパスワードを生成するというOP派生キー。 (EDIT:明確にするために、これらの2つのオプションは単一のキー値を生成するものと見なされます。「中間」BCryptハッシュの唯一の目的はSHAでハッシュされることです-256で、他の目的には使用されません)。明白な代替策は、HMAC-SHA256をPBKDF2アルゴリズムシェルのPRNGとして単純にプラグインし、同等の数の導出ラウンドを使用することです。
問題は、ここでの相対的な長所と短所は何ですか?明らかに、適切に実装および構成された両方のアプローチは、攻撃者に作業の重要な証拠を提示します。 BCrypt + SHA256の組み合わせは少し複雑に見えますが、これら2つの実装がすでにあり、独自のPBKDF2実装をロールする必要がある場合(.NETに組み込まれたPBKDF2は、SHA256ではなくSHA1を使用するようにハードコードされています)、最初のオプションは最終的には単純になります。 256ビットHMACで実装した場合のPBKDF2の利点の1つがわかります。実際のBCryptハッシュは192ビットにすぎないため、PBKDF2-SHA256での実際の最大256ビットではなく、BCrypt + SHA256コンボに固有のエントロピーの最大量は256ビットではありません。 BCrypt + SHA256は、.NETのPBKDF2の160ビットRfc2898DeriveBytes実装よりも優れており、上記のハッシュのいずれかを切り捨てまたはXOR折りたたみによって生成される128ビットでさえ、優れたAES AEADモードで十分に安全です。
意見?
パスワードデータベースが危険にさらされている場合、BCryptダイジェストをSHA-256でハッシュするだけで、暗号化キーが簡単に公開されます。暗号化キーにパスワード自体のPBKDF2を使用すると、これを防止できます。
もちろん、欠点もあります。説明したスキームを使用すると、サーバーはいつでもユーザーのキーを使用して暗号化操作を実行できますが、これは望ましい場合や必要な場合があります。ユーザーのパスワードのPBKDF2が使用されている場合、ユーザーがパスワードを入力しない限り、サーバーはこのキーを再生成できません。
Bcryptはすでにソルトを保持しているため、ここで解決しようとしている問題は、質問の256対標準の184ビットダイジェストからの制限されたエントロピーです。
実装を変更してエントロピーを少し増やすことは、潜在的な利益をはるかに上回るリスクであると私は主張します。
かなりの作業係数( 1秒以上 )での184ビットbcryptハッシュのブルートフォースに伴う計算能力は、優れたWordリストであっても根本的に禁止されているため、報酬は誇張されています。確かに256ビットも基本的に禁止されていますが、追加の保護が得られず、それに見合うだけのリスクがある場合は、桁違いです。
良い方法は、標準のbcrypt実装に固執し、システムのUXが許容できる最大の作業係数である、より大きな作業係数を選択することです。これにより、前向きな計画でリスクを最小限に抑え、パスワードのハッシュ方法の間違いを防ぐことができます。