7

所有在线示例都显示了 crypt 的使用,如下所示:

$pass = crypt('something','$6$rounds=5000$anexamplestringforsalt$');

但是每个人都说你不应该定义回合或盐。

那么我应该如何使用它呢?

我也遇到了一个问题:当我运行上面的代码时,它只运行 50 轮而不是 5000 轮,就好像系统正在停止它一样。

任何帮助将不胜感激。

//- 解决方案 -//

我发现其中一些很有用:

用于生成盐:

这是生成盐的随机方式

$randomString = random_bytes(32);

Base 64 编码,确保某些字符不会对 crypt 造成问题

$salt = base64_encode($randomString);

对于散列:

$hashed = crypt($passwordInput, '$6$'.$salt);

确认:

if (crypt($passwordInput, $hashed) == $hashed) { 
  // Valid action
} else { 
  // Invalid action
}

** 特别感谢@lathspell帮助我们找到上述解决方案 **

4

2 回答 2

5

运行该算法一定数量的轮次的主要原因只是为了减慢它的速度,以使蛮力攻击变得无趣。对于现代硬件来说,5000 次迭代就足够了。您也可以使用 100000,但是您的服务器管理员可能想和您谈谈 :-) rounds=5000 是 SHA-512 的默认值。最小值为 1000,最大值非常高。

于 2013-08-19T22:15:52.063 回答
5

使用 OpenSSL 生成盐,它更加随机。可能需要 20000 轮来证明你的代码。

function cryptPassword($password, $salt = "", $rounds = 20000)
{
    if ($salt == "")
    {
        // Generate random salt
        $salt = substr(bin2hex(openssl_random_pseudo_bytes(16)),0,16);
    }
    // $6$ specifies SHA512
    $hash = crypt($password, sprintf('$6$rounds=%d$%s$', $rounds, $salt));

    return $hash;
}
于 2017-06-08T07:02:31.110 回答