ここで見ているのは、パスワード ハッシュ以上のものです。これらの文字列に含まれるハッシュに関する多くのメタデータがあります。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 パスワードをスキャンすることがほぼ不可能になります。