ここでは、パスワードハッシュ以上のものがあります。これらの文字列に含まれるハッシュに関する多くのメタデータがあります。 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$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem
もabcd
であるため、bcryptでこれを行うことはできません。そして、bcrypt('abcd')
の結果になる多くの多くのハッシュがたくさんあります。これは不可能に近いabcdパスワードのデータベースをスキャンします。
おそらく(うまくいけば)パスワードは[塩漬け]です(http://en.wikipedia.org/wiki/Salt_(暗号化))? –
[Salting!](http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –
この動作は、設計によって_emphatically_です。 – SLaks