安全密码存储

时间:2012-06-08 15:28:31

标签: php security passwords md5 password-protection

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

开始,我在注册时创建了一个盐(随机生成)

$salt = "#52/sBsO8";

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

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

所以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哈希值。

3 个答案:

答案 0 :(得分:1)

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

crypt($password, $salt)

要对各种散列方法进行比较,请参阅Jeff Atwood's post about password hashing

关于暴力强制基准的摘录:

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 is too short to be considered nowadays(56位,谢谢@thebod)。

修改

虽然它没有在上面的基准测试方法中列出,但crypt支持的最佳散列方法是blowfish,这是一个使用它的示例:

// $salt has to be built with exactly these components:
// '$2a$' . $2DigitsNumberAroundTen . '$' . $TwentyTwoLetters
$salt = '$2a$07$somesillystringforsalt';
crypt( $password, $salt );

答案 1 :(得分:1)

  1. 密码的哈希函数应(需要一些计算时间)。大多数哈希算法都设计得很快,但这样可以更容易地为每个盐创建彩虹表。
  2. salt应该随机,并且应该为每个存储的密码单独生成。这个盐必须与哈希一起存储,但不是秘密的(可以是纯文本)。盐使字典攻击更加困难,不同的盐使得彩虹表不可行。
  3. 理想情况下,您可以稍后调整新硬件的计算时间,而不会破坏现有的哈希值。
  4. 这就是你应该使用 bcrypt 来哈希密码的原因,它专门用于散列密码。并且不要害怕使用bcrypt!它不仅适用于高安全性站点,使用它可以像使用md5哈希一样简单。

    建议使用像[{3}}这样完善的库,如果你想了解PHP如何生成这样的哈希,你可以阅读phpass

答案 2 :(得分:-1)

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

这实际上使它更不安全,因为如果一个人掌握了那个人有事可做的事情。

您最好不要花费精力确保计算机安全,网络安全,并通过合理安全的密码教授用户。