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

Does rehashing a randomly salted password at login increase security?

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

每次用户登录时使用新盐计算新散列,不会提高系统的安全性。

由于密码是一样的,只有盐改变了,一个可以访问散列的破解者可以以完全相同的成本进行暴力破解。改变盐不会提高安全性,盐不是秘密,即使知道它也能完成它的工作。隐藏或更改它不会增加任何价值(隐藏很困难,有比隐藏盐更好的方法来添加秘密)。

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

  • 破解者闯入服务器并在那里停留了一段时间未被发现。在这种情况下,密码可以在用户登录时以编程方式捕获。这比暴力破解强哈希算法需要更少的努力。
  • 破解者闯入,窃取了数据库的副本,作为回应,系统管理员堵塞了安全漏洞并迅速从备份中恢复了服务器。

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

值得记住我们​​在这里试图防范的事情。如果网站的安全性遭到破坏,则会对在其他流行服务中使用相同 username/password 组合的用户产生连锁反应。散列的一个主要原因,以及攻击者在暴力破解密码中的目的,是查看用户是否可以在其他地方被黑客攻击(例如他们的社交媒体或银行账户)。

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

gmail.alias+randomcode@gmail.com

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

拥有自己域名的用户可以做类似的事情 - 设置一个电子邮件帐户到 "catch all",然后使用您喜欢的任何别名。

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

加盐的原因是针对散列的字典攻击不起作用。由于相同的密码可以与许多不同的盐组合,因此可能有许多不同的哈希值。因此,不可能对密码 table 进行简单的散列,而没有盐是可能的。

因此,使用不同的盐值重新散列密码没有额外的好处。新盐应该和旧盐一样随机,因此也一样安全。

但是,当密码长时间不更改时,可能会使用哈希算法进行哈希处理,该算法在哈希计算时很好,但现在很差。 PHP has built-in functions especially for password hashing since PHP 5.5.

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