0

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

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

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

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

4

1 回答 1

0

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

此外,crypt手册页(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

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

于 2013-05-12T20:39:55.223 回答