パスワード1 で登録し、パスワード2 でサインインしてください。ログインできた場合、そのストレージは指定されたアルゴリズムでパスワードをハッシュ化しており、PHPは == を使用してそれらを比較しています(MD5、SHA-1、平文の場合)。
MD5、SHA-1、SHA-2ファミリー の場合、古くから知られたトリック(実際には文書化された機能です。PHP型比較表 と 浮動小数点数 を参照)を使用します。PHPでは '0e1' == '00e2' == '0' となることを、実用的 な目的で利用しているだけです。リスト内のどのパスワードも、他のどのパスワードとも 一致 します。これは 整数文字列が浮動小数点数にオーバーフローする トリックとは異なります。この2行 の違いに注目してください。
マジックハッシュを持つすべてのアルゴリズムは次のとおりです:
md5(md5(password))@0xb0bb の言葉を引用すると、「マジックハッシュには、パスワード比較以外の用途(キャッシュ層やハッシュ関数の出力から導出されるデータなど)もあり、これらの既知の安全でないアルゴリズムや、あまり知られていないアルゴリズム、擬似ハッシュアルゴリズムは、そのような場面でより簡単に見つけることができます。」
平文 の場合、さまざまな変換トリックを使用します。最初のパスワードは2番目のパスワードとのみ 一致 します。トリックは、それらを可能にするPHPバージョンごとにグループ化されています。
bcrypt はパスワードを最大72文字に切り詰めます。両方のパスワードの最初の72文字が一致する場合、パスワードは 一致 します。
descrypt(従来のUNIX DES crypt)はパスワードを最大8文字に切り詰めます。両方のパスワードの最初の8文字が一致する場合も、パスワードは 一致 します。「General cross-check」セクションを参照してください。
64バイトを超えるパスワードを PBKDF2-HMAC-SHA1 でハッシュ化する場合、最初にSHA1で プリハッシュ されます。そのため、sha1(password1) === bin2hex(password2) であれば PBKDF2-HMAC-SHA1(password1) === PBKDF2-HMAC-SHA1(password2) が成り立ちます。同様の プリハッシュ は PBKDF2-HMAC-SHA224 と PBKDF2-HMAC-SHA256 の場合にも適用されます。
現時点では、Norbert Tihanyi のおかげで、それぞれにマジックハッシュが1つだけあります。将来的にはさらに追加されることを願っています。
PHPで何か*を比較するときは、== ではなく === を使用してください。また、PHPでのパスワードハッシュ化には password_hash() と password_verify() を使用し、MD5やSHA-1は使用しないでください。*ハッシュを比較するときは hash_equals() を使用してください。
すべてはこのツイートから始まりました。2014年2月に QNKCDZO と 240610708 を生成し、その後、インターネット中に広まりました。ググってみてください。