假设我有成千上万的用户,我想让密码非常安全。现在,我已经知道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哈希值。
答案 0 :(得分:1)
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 );
答案 1 :(得分:1)
这就是你应该使用 bcrypt 来哈希密码的原因,它专门用于散列密码。并且不要害怕使用bcrypt!它不仅适用于高安全性站点,使用它可以像使用md5哈希一样简单。
建议使用像[{3}}这样完善的库,如果你想了解PHP如何生成这样的哈希,你可以阅读phpass。
答案 2 :(得分:-1)
为什么你认为这更安全?用户输入密码。人们认为用户不是白痴,而是选择他只知道的东西。如果该个人使用salt
输入了它,那会有什么不同?
这实际上使它更不安全,因为如果一个人掌握了那个人有事可做的事情。
您最好不要花费精力确保计算机安全,网络安全,并通过合理安全的密码教授用户。