我正在使用此功能生成密码:
function generarPassword($password, $cost=11){
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt='$'.implode('$',array("2y",str_pad($cost,2,"0",STR_PAD_LEFT),$salt));
return crypt($password,$salt);
}
我的问题是,当我在64位服务器上使用它时,结果如下:
$2y$11$1ws6drmcqHCWG8wj5bm5s.R8Opc0.JEjXy0.P9UsHjqoxjZQ5GYLW
当我在32位服务器上使用它时,结果如下:
$2uUq69/OVG3M
所以,我有两个问题:
谢谢!
答案 0 :(得分:5)
CRYPT_BLOWFISH - 河豚用盐调和如下:" $ 2a $", " $ 2×$"或者" $ 2y $",一个两位数的成本参数," $",和22个字符 来自字母" ./ 0-9A-Za-z"。使用此外的字符 salt中的range将导致crypt()返回零长度字符串
PHP之前的5.3.7仅支持" $ 2a $"作为salt前缀:PHP 5.3.7
您的$salt
不符合blowfish算法的22 characters from the alphabet
约束。您需要检查生成适当盐的过程。
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
echo $salt.' ('.strlen($salt).')';
// example: D3Zc0fv8BBLKYnpH0iSV0w== (24)
其次,您使用的是前缀$2y$
,仅在PHP 5.3.7之后支持。如果您在两个不同的系统上使用此代码,则需要解决这两个问题。