public static function blowfish($password, $storedpass = false) {
//if encrypted data is passed, check it against input ($info)
if ($storedpass) {
if (substr($storedpass, 0, 60) == crypt($password, "$2a$08$".substr($storedpass, 60))) {
return true;
} else {
return false;
}
} else {
//make a salt and hash it with input, and add salt to end
$salt = "143cd669b02e155c3cca6e";//substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
//for ($i = 0; $i < 22; $i++) {
//$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
//}
//return 82 char string (60 char hash & 22 char salt)
return crypt($password, "$2a$08$".$salt).$salt;
}
}
print(substr($storedpass, 0, 60)."<br />");
print(crypt($password, "$2a$08$".substr($storedpass, 60))."<br />");
print(substr($storedpass, 60));
产生结果:
$2a$08$143cd669b02e155c3cca6eM3k8s9BdE4jErJXJ8wSxshJDPcJQVPW
$2a$08$143cd669b02e155c3cca6eEiYm6ilW1ZC1PBS07LOh2XSq1NODSKK
143cd669b02e155c3cca6e
你可以看到我之前生成了一个 22 个字符的随机盐,我知道 PHPASS,mt_rand() 不是 CSPRNG 等等。让我感到困惑/担心的只是为什么 crypt()(给定 $password = ' admin') 即使使用静态盐也会生成不同的哈希。你可以看到我打印了 substr($storedpass, 60) 生成正确的盐,但是然后运行 crypt() 函数(使用相同的参数来创建初始 $storedpass)它会生成不同的结果,破坏身份验证我的一个(相对较小且不是关键任务)应用程序......