我正在使用:
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
用于散列密码,但与低于 5.3.7 的 PHP 版本不兼容。所以我创建了这个小函数来生成和验证密码 但是由于我不是安全性专家,我想知道它是相当安全还是仍然不安全。
我的职能:
//$hash variable is also used to check weather we are creating or verifying passwords.
function password($password,$hash=FALSE){
$salt=array("hfuiliffa","wiaelfbs","usfewl","fr6j5","gwg8","bs4$","fgthwv");//An array of salts
if ($hash){
foreach ($salt as $s1)
foreach ($salt as $s2)
if ($s1.sha1($s2.$password)===$hash)
return true;
return FALSE;//If we are still here means time to return false.
}else {
return $salt[array_rand($salt)].sha1($salt[array_rand($salt)].$password);
}
}
你能做的最好的事情就是使用新功能 password_hash()。如您所知,有一个适用于PHP版本5.3.7的兼容包。向上。
如果你真的需要支持较低的PHP版本,你可以将crypt参数从"$2y$%02d$"替换为"$2a$%02d$",这也会产生一个BCrypt哈希。这是您可以使用旧版本做的最好的事情。或者,您可以在我的主页上查看示例代码。
if (version_compare(PHP_VERSION, '5.3.7') >= 0)
$algorithm = '$2y$%02d$'; // BCrypt, with fixed unicode problem
else
$algorithm = '$2a$%02d$'; // BCrypt
如果你绝对需要支持 PHP 4.x,则没有 BCrypt 支持,在这种情况下,我建议使用 phpass 库。顺便说一句,你的方案与恒定的"盐"几乎没有提供任何保护。