1

http://php.net/manual/en/function.crypt.phpから取られたこの例を考えると

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

まず、ハッシュ方式がBLOWFISHの場合、ソルトの長さはどのくらいにする必要がありますか?

これは、上記の例で得られる出力です。

$2a$07$usesomesillystringsaled/4C6/vYhuH1f.Z/Kwf8X.c.e0jjHay

返された文字列に、ソルト、ラウンド、および使用しているハッシュの方法が格納されることを意図していますか?この動作でハッシュ化されたパスワードを保存する場合、?で始まる文字列全体を保存し$2aますか?

入力したパスワードをDB内のパスワードと照合するときに、残りのハッシュからソルトを分離するものがない場合、文字列からソルトを取得するにはどうすればよいですか?

編集:なぜこの方法は、たとえばSHA512 / 256を使用するよりも安全なのですか?誰かが塩を使ったハッシュの束に辞書攻撃/ブルートフォース方式を使用した場合、パスワードをより迅速に解読できるでしょうか?

4

2 に答える 2

1

はい、saltおよびその他の暗号化パラメータを文字列に格納することは意図的なものです。手動で行う必要がなくなり、ラウンド数を更新する必要がある場合に下位互換性が維持されます。

ソルトの有効文字数は22文字です。したがって、これらの2行は同じハッシュになります。

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalp$')

データベースからの結果を確認する場合は、データベース自体の文字列をのパラメータとして使用するだけですcrypt

これがデモンストレーションです。

于 2012-07-09T02:25:09.577 に答える
1

1)22文字のソルトが必要ですが、22文字のすべてのビットが使用されるわけではありません。これは、異なる文字22のグループで同じハッシュを取得できることを意味します。

2)結果のハッシュにソルトとラウンドを格納することは、実際には意図的なものです。このようにして、既存のハッシュからこの情報を抽出し、それを使用してユーザー入力を確認できます。60文字の長さのハッシュ全体を保存する必要があります。

3)ハッシュからパラメータを抽出してテストする必要はありません。これにより、PHP関数crypt()が自動的に実行されます。既存のハッシュを新しいcryptパラメータとして渡すだけです。私はbcryptを使ったパスワードハッシュの記事でそれがどのように行われるかを説明しようとしました。よく知られているライブラリを探している場合は、phpassを参照してください。

4)ある程度のCPU時間を必要とするため、より安全です。他のハッシュは高速になるように設計されていますが、これにより、毎秒数十億のパスワードを使用してブルートフォース攻撃を行うことができます。必要な時間は、新世代のコンピューターのために、後でコスト要因に合わせて調整できます。

于 2012-07-09T04:53:56.760 に答える