我正在使用 Blowfish 和 PHP crypt() 进行密码散列,但我注意到一些奇怪的东西。引用 PHP 文档:
CRYPT_BLOWFISH - Blowfish 用盐散列如下:“$2a$”、“$2x$”或“$2y$”,两位数的成本参数,“$”和字母表中的 22 位数字“./0-9A” -ZZ”。
我注意到包含在最终哈希中的盐短 1 个字符(最后一个被切断),好像盐太长了,但事实并非如此。
我的脚本输出示例:
盐:97504ebb48c4619f820f83,长度为 22
河豚:$2a$13$97504ebb48c4619f820f8u4QTtlV5MoqHt9l7hmK4jEohUXrI.0PK
哈希匹配。
如您所见,随机盐恰好是 22 位数字,但最终散列中缺少“3”。如果我只将盐设为 21 个字符,我会得到一个损坏的哈希并且它不起作用。那么为什么它会修剪最后一个字符呢?
PHP 手册中的示例还向随机盐添加了最后一个 $。那美元是有原因的,还是他们只是随机地将它添加到 Blowfish、SHA-256 和 SHA-512 以混淆所有人?
最后,这是我的代码:
if (CRYPT_BLOWFISH == 1) {
$salt = md5(uniqid(rand(), TRUE));
$salt = substr($salt, 0, 22);
echo "Salt: " . $salt . " with length " . strlen($salt) . "<br />";
$pass = "rasmuslerdorf";
$bsalt = "$2a$13$".$salt;
$blowfish=crypt($pass, $bsalt);
echo 'Blowfish: ' . $blowfish . "<br />";
if (crypt($pass, $blowfish) == $blowfish) {
echo "Hash match.<br />";
}
else echo "no<br />";
}
else {
exit("You need php 5.3 or newer");
}