使用此处描述的 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附加了额外的字符,导致尝试失败。
为什么会发生这种情况?