在登录时重新散列随机加盐的密码会提高安全性吗?


Does rehashing a randomly salted password at login increase security?

我目前正在PHP的一个项目上工作,我想知道如何使我的系统尽可能安全。我目前使用password_hash来散列我的密码,然后将它们存储在我的数据库中。我想知道的是:重新散列并将新的加盐散列重新保存到数据库中是否会提高安全性,或者这只是一种错觉?

我认为它不会增加安全性,不会。您有两个风险场景:

  • 黑客闯入服务器并在那里停留一段时间而不被发现。在这种情况下,可以在用户登录时以编程方式捕获密码。这比强制使用强哈希算法要省力得多。
  • 黑客闯入,窃取数据库的副本,作为响应,系统管理员堵塞安全漏洞,并从备份中快速恢复服务器。

在第二种情况下,黑客有一组用户名,电子邮件地址和散列密码,他们可能希望尝试暴力破解。如果这些散列被创建一次或一千次,则没有任何优势。

值得记住我们在这里试图防范的是什么。如果一个网站的安全性遭到破坏,那些在其他流行服务上使用相同用户名/密码组合的用户就会受到连锁反应。哈希的一个主要原因,以及攻击者在暴力破解密码中的目的,是为了看看用户是否可以在其他地方被黑客攻击(例如他们的社交媒体或银行账户)。

这就是为什么我们建议人们不要重复使用密码,而应该使用存储在密码管理器中的强密码。如果人们可以使用不同的用户名和/或不同的电子邮件,那就更好了。顺便说一句,使用每个服务的电子邮件是非常容易的:如果你的GMail地址是gmail.alias@gmail.com,只需这样做:

gmail.alias+randomcode@gmail.com

电子邮件当然应该存储在你的密码管理器中——如果你忘记了这一点,你将无法使用密码提醒功能,并且你将被锁定,除非服务愿意接受其他身份证明。尽管如此,这种方法对于使用被攻破的服务的连锁反应更强——如果用户总是使用不同的电子邮件地址,那么其他地方的弱密码提醒系统就更难被利用。

拥有自己域名的用户也可以做类似的事情——建立一个电子邮件帐户来"捕捉所有",然后使用任何你喜欢的别名。

每次用户登录时用一个新的盐计算一个新的哈希值,将而不是提高系统的安全性。

由于密码是相同的,只有盐改变,因此访问哈希的破解者可以以完全相同的代价进行暴力破解。更换盐不会提高安全性,盐不是秘密,即使知道它也能发挥它的作用。隐藏或更改它不会增加任何价值(隐藏是困难的,有比隐藏盐更好的方法来添加秘密)。

首先,我不是密码学专家。我在大学里上过密码学课,但这并不能使我成为密码学专家。

使用salt的原因是字典对哈希的攻击不起作用。由于相同的密码可以与许多不同的盐组合,因此可能存在许多不同的哈希值。因此,不可能有一个简单的哈希到密码表,而没有盐是可能的。

因此,使用不同的盐重新散列密码不会获得额外的收益。新盐应该和旧盐一样随机,因此同样安全。

但是,当密码长时间不更改时,可能使用哈希算法进行哈希,该算法在哈希时很好,但现在很差。从PHP 5.5开始,PHP有了专门用于密码散列的内置函数。

推荐的操作方法在PHP网站上有解释,但它归结为:使用password_verify检查密码,使用password_hash加密密码。使用password_needs_rehash检查密码是否使用安全散列进行了散列。如果不是,要么重新散列,要么要求用户更改它(取决于您的安全策略)。