使用salt和crypt()存储密码的安全性如何?


How secure is storing passwords with a salt and crypt()?

编写一个需要存储用户登录密码的应用程序。

现在,我使用下面的代码:

<?php
    $password = $_GET['password'];
    $salt = "pepper";
    $password = crypt($password,$salt);
?>

这种方法到底有多安全?例如,如果有人设法获得$salt,他们解密数据有多容易?

我不是密码学家,但这种方法相当薄弱,因为使用的默认哈希算法是DES的修改版本,DES可以在短时间内用相对便宜的硬件被破解:考虑到1998年EFF Deep Crack在22小时内破解了未修改的DES,破解或找到这个修改版本的碰撞应该不是那么困难。

此外,crypt manpage (PHP在*nix系统上包装的函数)报告:

警告:键空间由2**56等于7.2e16个可能的值组成。使用大规模并行计算机可以对这个键空间进行穷举搜索。像crack(1)这样的软件是可用的,它将搜索这个通常被人类用于密码的密钥空间的一部分。因此,密码选择至少应该避免使用常见的单词和名称。

相反,使用SHA-512并执行多个哈希循环:

// Take advantage of mcrypt extension if it is installed!
// Otherwise, generate $salt in any other way, but don't use a fixed one
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$hash = crypt($password, '$6$rounds=10000$' . $salt . '$');
echo $hash;

具有足够轮数的SHA-512被认为是*nix领域密码哈希的工业标准,mcrypt_create_iv提供了良好的(在熵的意义上)$salt

最后注意:请确保使用适当的salt,并为每个用户生成不同的salt