使用crypt生成密码(32位与64位)

seb*_*ria 0 php security crypt salt

我正在使用此函数生成密码:

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);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在64位服务器上使用它时,结果如下:

$2y$11$1ws6drmcqHCWG8wj5bm5s.R8Opc0.JEjXy0.P9UsHjqoxjZQ5GYLW
Run Code Online (Sandbox Code Playgroud)

当我在32位服务器上使用它时,结果如下:

$2uUq69/OVG3M
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题:

  1. 为什么会这样?的$salt是在两个相同的长度
  2. 32位密码有任何安全问题吗?

谢谢!

Dev*_*von 5

CRYPT_BLOWFISH - 带有盐的河豚散列如下:"$ 2a $","$ 2x $"或"$ 2y $",两位数的成本参数"$",字母表中的22个字符"./0-9A -za-Z".在salt中使用此范围之外的字符将导致crypt()返回零长度字符串

5.3.7之前的PHP仅支持"$ 2a $"作为salt前缀:PHP 5.3.7

$salt不符合22 characters from the alphabetblowfish算法的约束.您需要检查生成适当盐的过程.

$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
echo $salt.' ('.strlen($salt).')';
// example: D3Zc0fv8BBLKYnpH0iSV0w== (24)
Run Code Online (Sandbox Code Playgroud)

其次,您使用的$2y$是仅在PHP 5.3.7之后支持的前缀.如果您在两个不同的系统上使用此代码,则需要解决这两个问题.