Php 安全密码存储
假设我有数千个用户,我想让密码非常安全。现在,我了解到Php 安全密码存储,php,security,passwords,md5,password-protection,Php,Security,Passwords,Md5,Password Protection,假设我有数千个用户,我想让密码非常安全。现在,我了解到md5()并不是最安全的使用方法,但是我认为可以采取的安全措施是使用盐(我知道这并不是什么新鲜事)。为此,我考虑创建两个表,一个名为accounts,其中包含与帐户相关的所有信息,另一个表列名为salt,第二个表名为auth,包含account\u id,password 首先,我在注册时创建一个salt(随机生成) 然后,所有提供的信息都会进入账户salt,salt就是其中之一 然后,在成功地将信息放入数据库后,我创建了将存储在auth表中
md5()
并不是最安全的使用方法,但是我认为可以采取的安全措施是使用盐(我知道这并不是什么新鲜事)。为此,我考虑创建两个表,一个名为accounts
,其中包含与帐户相关的所有信息,另一个表列名为salt
,第二个表名为auth
,包含account\u id,password
首先,我在注册时创建一个salt(随机生成)
然后,所有提供的信息都会进入账户
salt,salt就是其中之一
然后,在成功地将信息放入数据库后,我创建了将存储在auth
表中的密码,这样,密码就不是用户输入的密码的md5,而是salt的md5和用户输入的密码
因此,auth
中的密码是
$password = md5($user_entered_password . $salt);
测试字符串:
PHP代码
输出:202cb962ac59075b964b07152d234b70/dfbf0b257c5182af0ae893c2680f4594
问题是:这是处理密码的一种相当安全的方法吗?由于
md5()
解密网站,有很多方法可以猜测密码。而解密网站实际上并不解密md5()
,它们只是拥有数百万字符串的md5哈希。md5可能是“流行”哈希算法中最不安全的一种。因为您使用的是PHP,所以更好的选择是
crypt
:
有关各种哈希方法的详细比较,请参见
关于暴力强制基准测试的摘录:
MD523070.7米/秒SHA-17973.8米/秒
SHA-2563110.2米/秒
SHA-512267.1米/秒
NTLM44035.3米/秒
DES185.1m/s
WPA/WPA2348.0 k/s 虽然越低越好(56位,谢谢@thebod) 编辑: 虽然上面的基准方法中没有列出它,但是
crypt
支持的最好的散列方法是blowfish,下面是一个使用它的示例:
// $salt has to be built with exactly these components:
// '$2a$' . $2DigitsNumberAroundTen . '$' . $TwentyTwoLetters
$salt = '$2a$07$somesillystringforsalt';
crypt( $password, $salt );
你为什么认为这更安全?用户键入密码。人们假设用户不是白痴,并选择他只知道的东西。如果那个人用
salt
输入,这有什么不同
这实际上使它更不安全,因为如果一个人拿到桌子,他就有东西要处理
你最好把精力花在确保计算机安全、网络安全以及教用户使用合理安全的密码上
建议使用一个完善的库,如,如果您想了解PHP如何生成这样的散列,可以阅读此文。use bcrypt:从未听说过,但是为什么这种方式不安全呢?如果不直接回答您的问题,这可能会有所帮助:下面是关于php@Grigor中多种密码散列方法的好处的一个很好的讨论——不自己编写代码的两个原因。1.由于您不是安全专家,很容易犯编码错误或忽略某些事情。2.为什么要重新发明轮子?@Grigor:使用昂贵的杂烩。你不需要快速的散列。您希望使生成查找表/暴力事件变得困难。bcrypt拥有这一点;我没有投你反对票,但我猜这是因为你的回答似乎表明添加盐根本没有好处,这是不对的。它只是没有提供足够的好处。现在,带有费用因素的哈希算法是保护用户的最佳方法。不幸的是,你总是会有用户将他们的密码设置为一些简单的东西,你必须保护他们不受他们自己愚蠢行为的影响。@Gareth-它根本没有任何好处。将机器生成的字符串添加到(支持的)人工生成的随机字符字符串中只会得到一个随机字符字符串。又名密码。有些系统的初始密码只是机器生成的
salt
(一个随机字符串)。至于保护他们不受愚蠢行为的伤害,你不能——密码只是按键的集合。任何有这种知识的人都能做到。有人知道吗?盐确实有好处。首先,它使彩虹表的使用基本上无用。第二,如果您不使用salt,则运行暴力攻击的攻击者可以将结果与您的所有用户密码进行比较(他们实际上是在创建自己的彩虹表)。有了salt,你必须单独攻击每个密码。我打赌LinkedIn希望它使用salt,我认为自从泄露以来它现在就使用了salt@飞利浦salt的OP定义只是要附加到密码的字符串。i、 e.通过添加由机器创建的随机字符而变长的密码。因此,要猜密码,您不知道密码的长度和内容。让我们假设
$password = "123";
$salt = "#52/sBsO8";
echo md5($password) ." / ";
echo md5($password . $salt);
crypt($password, $salt)
// $salt has to be built with exactly these components:
// '$2a$' . $2DigitsNumberAroundTen . '$' . $TwentyTwoLetters
$salt = '$2a$07$somesillystringforsalt';
crypt( $password, $salt );