在PHP中正确使用带有SHA512的crypt()

时间:2013-08-19 02:55:05

标签: php password-encryption crypt

在线的所有示例都显示了这样使用crypt:

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

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

那我该如何使用呢?

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

非常感谢任何帮助。

// - 解决方案 - //

我发现其中一些有用:

用于生成盐:

 $salt = substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345‌​6789"), 0, 8); 

如果你有一个linux服务器,这是一种更随机的生成盐的方法

$fp = fopen('/dev/urandom', 'r');
$randomString = fread($fp, 32);
fclose($fp);

Base 64编码以确保某些字符不会导致crypt

出现问题
$salt = base64_encode($randomString);

对于哈希:

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

确认:

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

**特别感谢@ lathspell 获取有关上述解决方案的帮助**

2 个答案:

答案 0 :(得分:4)

将算法运行一定数量的轮次的主要原因就是放慢速度以使暴力攻击无趣。因此,即使对于现代硬件,5000次迭代也足够了。你也可以使用100000但是你的服务器管理员可能想跟你说一句话:-) rounds = 5000是SHA-512的默认值。最小值为1000,最大值非常高。

答案 1 :(得分:0)

使用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;
}