3

假设我有成千上万的用户,我想让密码非常安全。现在,我知道这md5()不是最安全的使用方法,但是我认为可以做的就是加盐(我知道这不是什么新鲜事)。因此,为此我正在考虑创建两个表,一个名为accounts,它将包含与帐户相关的所有信息,一个名为表列salt,第二个表将被称为类似auth并具有字段account_id, password

首先,我在注册时创建一个盐(随机生成)

$salt = "#52/sBsO8";

然后所有提供的信息都转到accountssalt 是其中之一

然后在成功将信息放入数据库后,我创建了要存储在auth表中的密码,这样密码不是用户输入的密码的 md5,而是盐的 md5 和用户输入的密码

所以密码auth

$password = md5($user_entered_password . $salt);

测试字符串:PHP 代码

$password = "123";
$salt = "#52/sBsO8";
echo md5($password) ." / ";
echo md5($password . $salt);

输出:202cb962ac59075b964b07152d234b70 / dfbf0b257c5182af0ae893c2680f4594

问题是:这是一种非常安全的密码处理方式吗?由于md5()解密网站,有很多方法可以猜测密码。解密网站实际上并没有解密,md5()它们只是拥有数百万个字符串的 md5 哈希值。

4

3 回答 3

1

md5 可能是“流行”散列算法中最不安全的。
由于您使用的是 PHP,因此更好的选择是crypt: http: //php.net/manual/en/function.crypt.php

crypt($password, $salt)

有关各种散列方法的良好比较,请参阅Jeff Atwood 关于密码散列的帖子

关于蛮力基准测试的摘录:

MD5 23070.7 M/s
SHA-1 7973.8 M/s
SHA-256 3110.2 M/s
SHA-512 267.1 M/s
NTLM 44035.3 M/s
DES 185.1 M/s
WPA/WPA2 348.0 k/s

越低越好,尽管现在 DES 太短而无法考虑(56 位,感谢@thebod)。

编辑:

虽然上面的基准方法中没有列出,但crypt支持的最佳哈希方法是河豚,这里有一个使用它的例子:

// $salt has to be built with exactly these components:
// '$2a$' . $2DigitsNumberAroundTen . '$' . $TwentyTwoLetters
$salt = '$2a$07$somesillystringforsalt';
crypt( $password, $salt );
于 2012-06-08T15:40:33.960 回答
1
  1. 密码的哈希函数应该很(需要一些计算时间)。大多数哈希算法的设计速度很快,但这使得为每种盐创建彩虹表变得更加容易。
  2. 盐应该是随机的,并且应该为每个存储的密码单独生成。该盐必须与哈希一起存储,但不是秘密的(可以是纯文本)。盐使字典攻击更加困难,不同的盐使彩虹表变得不切实际。
  3. 理想情况下,您可以稍后为新硬件调整计算时间,而不会破坏现有的哈希值。

这就是为什么你应该使用bcrypt来散列你的密码,它是专门为散列密码而设计的。不要害怕使用 bcrypt!它不仅适用于高安全性站点,而且使用起来就像使用 md5 哈希一样简单。

建议使用完善的库,如phpass,如果您想了解 PHP 如何生成此类哈希,可以阅读这篇文章

于 2012-06-08T16:19:45.957 回答
-1

为什么你认为这更安全?用户输入密码。假设用户不是白痴并选择了他只知道的东西。如果那个人用 输入它有什么不同salt

这实际上使它更加不安全,因为如果一个人拿到桌子,那个人就有事情要做。

您最好将精力花在确保计算机安全、网络安全以及教您的用户使用合理且安全的密码上。

于 2012-06-08T15:41:13.490 回答