718

Coda Hale の記事「パスワードを安全に保存する方法」では、次のように主張しています。

bcrypt には、レインボー テーブル攻撃を防ぐためのソルトが組み込まれています。

彼はこの論文を引用しており、OpenBSD の の実装についてbcrypt次のように述べています。

OpenBSD は、arcfour (arc4random(3)) キー ストリームから 128 ビットの bcrypt ソルトを生成し、カーネルがデバイス タイミングから収集したランダム データをシードします。

これがどのように機能するのかわかりません。私の塩の概念では:

  • 保存されたパスワードごとに異なる必要があるため、それぞれに個別のレインボー テーブルを生成する必要があります。
  • 反復できるように、どこかに保存する必要があります。ユーザーがログインしようとすると、パスワードの試行を行い、最初にパスワードを保存したときに行ったのと同じソルトとハッシュの手順を繰り返し、比較します

Devise (Rails ログイン マネージャー) を bcrypt で使用している場合、データベースにソルト列がないため、混乱します。ソルトがランダムでどこにも保存されていない場合、どうすれば確実にハッシュ プロセスを繰り返すことができるでしょうか?

要するに、どのようにして bcrypt に salt を組み込むことができるのでしょうか?

4

5 に答える 5

895

これは bcrypt です:

ランダムソルトを生成します。「コスト」係数が事前に構成されています。パスワードを収集します。

ソルトとコスト ファクターを使用して、パスワードから暗号化キーを取得します。既知の文字列を暗号化するために使用します。コストソルト、および暗号文を保存します。これら 3 つの要素の長さは既知であるため、それらを連結して 1 つのフィールドに格納するのは簡単ですが、後で分割することもできます。

誰かが認証しようとすると、保存されているコストとソルトを取得します。入力パスワード、コスト、およびソルトからキーを導出します。同じ既知の文字列を暗号化します。生成された暗号文が保存されている暗号文と一致する場合、パスワードは一致しています。

Bcrypt は、PBKDF2 などのアルゴリズムに基づく従来のスキームと非常によく似た方法で動作します。主な違いは、派生キーを使用して既知のプレーン テキストを暗号化することです。他のスキームは (合理的に) 鍵導出関数が不可逆的であると想定し、導出された鍵を直接保存します。


データベースに格納されたbcrypt「ハッシュ」は、次のようになります。

$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

これは実際には「$」で区切られた 3 つのフィールドです。

  • 2abcrypt使用されたアルゴリズムのバージョンを識別します。
  • 10はコスト要因です。2鍵導出関数の10回の反復が使用されます (ちなみに、これは十分ではありません。12 回以上のコストをお勧めします。)
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa変更された Base-64 で連結およびエンコードされたソルトと暗号文です。最初の 22 文字は、salt の 16 バイト値にデコードされます。残りの文字は、認証のために比較する暗号文です。

この例は、Coda Hale の ruby​​ 実装のドキュメントから抜粋したものです。

于 2011-07-26T16:11:59.347 に答える
200

その言葉は次のように表現されるべきだったと思います。

bcrypt には、レインボー テーブル攻撃を防ぐために、生成されたハッシュにソルトが組み込まれています。

ユーティリティ自体は、bcryptソルトのリストを保持していないようです。むしろ、ソルトはランダムに生成され、関数の出力に追加されるため、後で記憶されます (の Java 実装によるbcrypt)。別の言い方をすれば、 によって生成される「ハッシュ」は単なるbcryptハッシュではありません。むしろ、連結されたハッシュソルトです。

于 2011-07-26T15:34:14.567 に答える
0

ハッシュ化されたパスワードが 1 つあるテーブルを想像してみましょう。ハッカーがアクセスした場合、彼はソルトを知っていますが、すべての一般的なパスワードの大きなリストを計算し、計算ごとに比較する必要があります. これには時間がかかりますが、彼は 1 つのパスワードしかクラックできませんでした。

同じテーブルに 2 番目のハッシュ化されたパスワードがあるとします。ソルトは表示されますが、ソルトが異なるため、これもクラックするには上記と同じ計算を再度実行する必要があります。

ランダムな塩が使用されていなければ、はるかに簡単だったはずですが、なぜですか? 単純なハッシュを使用する場合、一般的なパスワードのハッシュを 1 回生成するだけで (レインボー テーブル)、単純なテーブル検索、または db テーブル ハッシュと事前に計算されたハッシュの間で単純なファイル検索を実行してプレーン パスワードを見つけることができます。

于 2021-10-18T00:51:10.160 に答える