2012-06-24 9 views
8

私はレールで作業しています。私は、password_digestがパスワードダイジェスト以外のすべてのフィールドが異なる2人のユーザで異なっていることに気付きました。しかし、私はbcryptの宝石は、ハッシュを生成し、思ったことはこれらの2つの異なるハッシュ同じパスワードを持つ2人のユーザーのパスワードハッシュが異なるのはなぜですか?

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

を生成することになった。..
の両方に同じパスワード "ABCD" を使用しましたパスワードフィールドにのみ基づいて!私が間違っている? ありがとう:)

+0

おそらく(うまくいけば)パスワードは[塩漬け]です(http://en.wikipedia.org/wiki/Salt_(暗号化))? –

+0

[Salting!](http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –

+0

この動作は、設計によって_emphatically_です。 – SLaks

答えて

16

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

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

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

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

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

最初の22文字は塩です。

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

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

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

+1

ありがとう!:)それは本当に役立ち、私が期待していたものよりもはるかに大きかった! – viswa

2

bcryptは、パスワードハッシュに塩を格納します。

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

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

関連する問題