假设我有成千上万的用户,我想让密码非常安全。现在,我了解到 md5()
并不是最安全的使用方法,但是我认为为了安全起见可以做的就是给它加盐(我知道这不是什么新鲜事)。因此,为此我正在考虑创建两个表,一个名为 accounts
的表将包含与帐户相关的所有信息,一个名为 salt
的表列,第二个表将被称为 something像 auth
并且有字段 account_id, password
首先,我在注册时创建了一个盐(随机生成)
$salt = "#52/sBsO8";
然后所有提供的信息都会转到帐户
salt 是其中之一
然后在成功将信息放入数据库后,我创建了将存储在 auth
表中的密码,这样密码就不是用户输入的密码的 md5,而是它的salt的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 哈希值。
最佳答案
md5 可能是“流行”哈希算法中最不安全的。
由于您使用的是 PHP,更好的选择是 crypt
: http://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 );
关于php - 安全密码存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951740/