ここで説明されているように PassHash クラスを使用すると、ログインの詳細を既存のハッシュと照合するときに問題が発生します。
class PassHash {
private static $algo = '$2a';
private static $cost = '$10';
public static function unique_salt() {
return substr(sha1(mt_rand()),0,22);
}
public static function hash($password) {
return crypt($password,
self::$algo .
self::$cost .
'$' . self::unique_salt());
}
public static function check_password($hash, $password) {
$full_salt = substr($hash, 0, 29);
$new_hash = crypt($password, $full_salt);
//echoing values for comparison's sake
echo 'Full Salt '.$full_salt.'<br/>';
echo 'password '.$password.'<br/>';
echo 'New Hash '.$new_hash.'<br/>';
echo 'Hash '.$hash.'<br/>';
return ($hash == $new_hash);
}
}
上記を使用してパスワードの例を登録するpassmark
と、 のハッシュが保存されます$2a$10$0cc127859c17132050924uI2.10wlIVA.7XwrFtMJdx
。
ただし、入力されたログインを比較しようとすると、同じパスワードが としてハッシュされ$2a$10$0cc127859c17132050924uI2.10wlIVA.7XwrFtMJdxCXjoQYEt8S
、
余分な文字CXjoQYEt8S
が追加され、試行が失敗します。
なぜこれが起こるのでしょうか?