10

私はレールを使用していますが、パスワード ダイジェスト以外のすべてのフィールドが異なる 2 人のユーザーの password_digest が異なることに気付きました。しかし、両方に同じパスワード「abcd」を使用しました..
これら2つの異なるハッシュを生成することになりました

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

bcrypt gem はパスワード フィールドのみに基づいてハッシュを生成すると思いました! 私が間違っている?ありがとう :)

4

2 に答える 2

23

ここで見ているのは、パスワード ハッシュ以上のものです。これらの文字列に含まれるハッシュに関する多くのメタデータがあります。bcrypt に関しては、文字列全体が bcrypt ハッシュと見なされます。含まれるものは次のとおりです。

$ は bcrypt の区切り文字です。

$ 2a $ は、使用された bcrypt アルゴリズムです。

$ 10 $ は、使用された原価係数です。これが、bcrypt がハッシュの保存に非常に人気がある理由です。すべてのハッシュには複雑性/コストが関連付けられています。これは、コンピューターがこのハッシュを生成するのにかかる時間と考えることができます。もちろん、この数値はコンピューターの速度に比例するため、コンピューターが年々高速化するにつれて、10 のコストでハッシュを生成するのにかかる時間はますます短くなります。したがって、来年はコストを 11 に増やします。 12... 13... など。これにより、古いハッシュを有効に保ちながら、将来のハッシュを強力に保つことができます。元の文字列を再ハッシュしないと、ハッシュのコストを変更できないことに注意してください。

$QyrjMQf... はソルトとハッシュの組み合わせです。これは base64 でエンコードされた文字列です。

最初の 22 文字はソルトです。

残りの文字は、2a アルゴリズム、コスト 10、指定されたソルトで使用した場合のハッシュです。ソルトの理由は、攻撃者が bcrypt ハッシュを事前に計算して、生成コストの支払いを回避できないようにするためです。

実際、これはあなたの最初の質問に対する答えです: ハッシュが異なる理由は、ハッシュが同じである場合、bcrypt 文字列を見たときはいつでも$2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzOパスワードがabcd. したがって、ハッシュのデータベースをスキャンするだけで、そのハッシュを検索することで、abcd パスワードを持つすべてのユーザーをすばやく見つけることができます。

$2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlemもであるため、bcrypt でこれを行うことはできませんabcd。そして、 の結果となるハッシュは、他にもたくさんありますbcrypt('abcd')。これにより、データベースで abcd パスワードをスキャンすることがほぼ不可能になります。

于 2012-06-24T13:27:54.560 に答える
2

bcryptソルトをパスワードハッシュに保存します。

これらは、2 つの異なるソルトを持つ同じパスワードの 2 つの異なるハッシュです。

パスワードを検証するとき、bcrypt はハッシュ フィールドからソルトを読み取り、そのソルトを使用してハッシュを再計算します。

于 2012-06-24T13:28:09.567 に答える