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

时间:2015-10-23 14:55:14

标签: php security salt crypt

我正在使用此功能生成密码:

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

所以,我有两个问题:

  1. 为什么会这样? <{1}}在
  2. 中的长度相同
  3. 32位密码是否存在安全问题?
  4. 谢谢!

1 个答案:

答案 0 :(得分:5)

  

CRYPT_BLOWFISH - 河豚用盐调和如下:&#34; $ 2a $&#34;,   &#34; $ 2×$&#34;或者&#34; $ 2y $&#34;,一个两位数的成本参数,&#34; $&#34;,和22个字符   来自字母&#34; ./ 0-9A-Za-z&#34;。使用此外的字符   salt中的range将导致crypt()返回零长度字符串

     

PHP之前的5.3.7仅支持&#34; $ 2a $&#34;作为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之后支持。如果您在两个不同的系统上使用此代码,则需要解决这两个问题。