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

时间:2013-05-12 20:33:01

标签: php encryption passwords salt password-encryption

编写需要存储用户密码以进行登录的应用程序。

目前,我正在使用以下代码:

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

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

1 个答案:

答案 0 :(得分:0)

我没有密码学家,但是这种方法相当薄弱,因为使用的默认哈希算法是DES的修改版本,DES可以在短时间内用相对廉价的硬件破解:给定未修改的DES 1998年EFF Deep Crackcrypt manpage在22小时内破获,这个修改版本的破解或发现碰撞不应该那么困难。

此外,{{3}}(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

最终通知:确保使用适当的盐并为每个用户生成不同的