Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 安全密码存储_Php_Security_Passwords_Md5_Password Protection - Fatal编程技术网

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
输入,这有什么不同

这实际上使它更不安全,因为如果一个人拿到桌子,他就有东西要处理

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

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


    建议使用一个完善的库,如,如果您想了解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 );