私はパスワードハッシュビジネス全体にかなり慣れていないので、明らかなことを逃しているかもしれません。
私はbcryptアルゴリズム、特に BCrypt.Net を見ていて、ランダムなソルトの代わりに各ユーザーの一意のソルトを計算する方が安全ではないかと思っていましたか?
現時点では、ソルトとワークロード(#ラウンド)がハッシュされたパスワード文字列で公開されています。 ($ 2a $ + 2桁のワークロード+ $ + 22文字のソルト+ 31文字のハッシュされたパスワード)潜在的なハッカーにソルトを提供することで支援していませんか(たとえば、管理者のパスワードを総当たりしたい場合)。
電子メールアドレスをハッシュして(たとえば、MD5またはSHA1を使用して)各ユーザーのソルトを計算できませんか?
次に、bcryptハッシュされたパスワードの最後の31文字のみを保存し、識別子、ワークロード(固定している場合)、および最も重要なソルトを除外します。これは、パスワードを見つけようとする人にとってそれをはるかに難しくしませんか?
(そしてプラス面では、パスワードが60文字ではなく31文字しかないため、大規模なユーザーデータベース用にデータベーススペースを確保できます)
私はこの反射を最初にすることができないので、おそらく私は明白な何かを見逃しているでしょう。
マーク
特定のユーザーに対して固定ソルトを使用したくないのは、ソルトの再利用につながる可能性があるためです。これは悪いことです(ソルトの全体的な考えは再利用されないため、ソルトの大文字の罪です。他の機能はありません)。 。塩の再利用は、実際には次の2つの理由で発生します。
ユーザーがパスワードを変更した場合、新しいパスワードは古いパスワードと同じソルトを使用します。古いパスワードは依然として価値があるため(ユーザーがパスワードを再利用するため、古いパスワードは、ユーザーが来月設定するパスワードにすることができます。別のサイトの同じユーザーのパスワードにすることもできます)、再利用により攻撃者は、1つのブルートフォースのコストで古いパスワードと新しいパスワードの両方を攻撃します。
ソルトがユーザー名から派生している場合、「管理者」は常にになる傾向があるため、別のサーバー上のサーバーソフトウェアの別のインスタンスが同じソルトになる可能性があります(= /// =) 「管理者」と呼ばれる。攻撃者は、多くのサイトに適用可能な「管理者」用の大きなテーブル(例:レインボーテーブル)を事前に計算する可能性があります(これにより、テーブルの作成に労力を費やす価値があります)。
私は通常、ソルトは一意でなければならないtimewise(古いソルト値の再利用なし)およびworldwide(no別のサーバー上でも、どこでもソルトを再利用できます)。そのような一意性を取得することは困難ですが、それでもかなり単純な方法があります。これは、十分に大きなソルト(bcryptが使用する128ビットのソルトなど)をランダムに生成することです。
Summary: bcrypt saltをランダムに生成しないと、more安全ではなくなります。せいぜい、これは等しく安全ですが、おそらく少ない安全です。
ソルトの理由は、事前に計算されたレインボーテーブルによる攻撃を防ぐためです。攻撃者はパスワードごとに1つのRainbowテーブルを作成する必要がありますが、これは意味がありません(一致が見つかるまで総当たりするのが簡単です)。したがって、ハッシュ値でプレーンテキストが表示されている場合でも、ソルトの処理は完了します。
シークレットを計算に追加する場合は、追加のpepperを追加できます。ソルトとは対照的に、ペッパーはnotがデータベースに格納されます。これは、攻撃者がデータ(SQLインジェクションなど)にのみアクセスでき、コードにはアクセスできない場合に限り、辞書攻撃に対して役立ちます。
塩とコショウは別の目的を果たすので、混ぜません。そして、あなたの質問に答えるために、ランダムな塩を使用し、隠されたものを追加したい場合は、コショウを追加してください。
Bcryptのソルトは128ビット長でランダムに生成されるため、衝突の確率が50%になる前に2 ^ 127人のユーザーが必要になります。それを視点に置いてみましょう:地球上のすべての人が、すべてのatomについてユーザーアカウントを作成することができます。
ランダム塩を使用してください。計算されたソルトを含むソリューションは いくつかの微妙な問題 を引き起こし、最終的には面倒と大災害の違いにつながる可能性があります。