Security 在登录时重新散列存储的密码有什么好处吗?

Security 在登录时重新散列存储的密码有什么好处吗?,security,salt,Security,Salt,我正在使用各种不安全/非常不安全的基于MD5的密码哈希更新几个项目。我现在至少对最佳实践有了更好的了解,但我仍然怀疑自己是否做错了什么。我还没有看到我在其他地方使用的具体流程。就我而言: 密码哈希是使用bcrypt生成的。(因为正确的选项似乎是bcrypt、scrypt或pbkdf2,而我在PHP中最容易访问bcrypt。) 每个散列使用不同的随机盐。(防止攻击者生成使用单个静态salt计算的自定义彩虹表。) 散列、算法设置和salt存储在一起。(因为这是PHP的crypt函数为哈希值提供的。

我正在使用各种不安全/非常不安全的基于MD5的密码哈希更新几个项目。我现在至少对最佳实践有了更好的了解,但我仍然怀疑自己是否做错了什么。我还没有看到我在其他地方使用的具体流程。就我而言:

  • 密码哈希是使用bcrypt生成的。(因为正确的选项似乎是bcrypt、scrypt或pbkdf2,而我在PHP中最容易访问bcrypt。)

  • 每个散列使用不同的随机盐。(防止攻击者生成使用单个静态salt计算的自定义彩虹表。)

  • 散列、算法设置和salt存储在一起。(因为这是PHP的crypt函数为哈希值提供的。)

  • 成功登录后,将使用新的随机salt重新计算哈希

这是我想知道的最后一步。我打算在这里允许随着时间的推移更新哈希算法,这样定期登录的用户将以最安全的格式存储密码

我的问题是:

  • 这是浪费时间吗

  • 这样做有危险吗


  • UDPATE

    对不起。完全没有领会你关于使用较新算法的观点。这是件好事。:-)但正如我在下面的原始答案中所述,当算法保持不变时,它是无用的

    原创

    重新设置密码是没有用的,因为如果攻击者已经掌握了哈希,那么您就不会阻止任何事情

    考虑以下几点:

    • 我是您网站上的一名用户,哈希为:1234567890
    • 某个攻击者获得了该散列
    • 我再次登录,哈希值被更改
    • 攻击者不在乎散列更改,因为他只需要一个散列就可以尝试破坏
    因此,没有任何事情被阻止。攻击者仍然拥有哈希,并且仍然可以尝试破坏它。可能的攻击者只对最终结果(密码)感兴趣,而对哈希值不感兴趣

  • 如果有人获得了对散列的访问权,那么每次更改它都不会有任何帮助,除非该人能够访问每个更新并愿意重新开始。这是不会发生的,如果发生了,你会遇到更大的问题

  • 不,它没有危险,只是浪费了服务器资源


  • 更新

    Re delnan的评论:如果你正在对已经散列的密码进行散列,不要——你永远不知道在链接散列时会出现什么漏洞。显然,另一方面是,每次验证用户机密时,都需要计算整个哈希链——所以只需重新哈希明文即可

    原创

    我读了一半就投了赞成票。看起来你是一个提出了正确问题的人来做这种工作

  • 不是浪费时间
  • 危险总是存在的。有人可能通过折磨或更可能的社会工程获得你用户的密码。有人可以访问大量的资源,而且你的影子密码文件仍然能够破解密码。有人可能会破坏您的服务器,并在成功登录时秘密插入一个拦截用户明文密码的特洛伊木马
  • 因此,没有完美安全的保证。曾经但我相信你已经知道了。这就是为什么我只想补充一件事:

    • 鼓励用户选择难以破解的密码

    而且,严格地说,如果每次登录时重新设置密码的唯一原因是密码总是使用最新的更新来存储,那么是的——假设您不会在每个用户登录时更新算法,那么您的方法就是浪费时间。因此,对于一行中的两次登录,将有使用相同算法和(假定)安全性的重新登录。在重新灰化上浪费几个时钟周期。严格地说,它不是优化的。为什么不在您的密码存储中包含一个algo版本,如果系统algo比用户的哈希算法更新,则在重新登录时重新登录。

    事实上,它可以防止新手cookie攻击者将cookie复制到浏览器中只是为了模拟……因此,如果所有者稍后登录时使用更改的哈希,它将使攻击者注销,从而减少对用户帐户的破坏。

    RE#2我认为OP意味着在每次登录时用新的盐重新散列的方法所特有的陷阱或漏洞。我正在重新散列散列密码,但不是以与此问题直接相关的方式。作为对所有使用不安全密码的用户的一次性更新,我存储了他们的散列密码的散列(因此我有bcrypt of md5),该散列已标记,以便我可以检测到它。这就是我开始在每次登录时重新哈希密码的最初原因,它允许在用户登录时更新这些特殊情况。为新算法重新计算哈希是好的,但我只会在算法更改时更新哈希。每次更改散列可能会让其他开发人员认为这更安全,而实际上并非如此。但是,这不会损害安全性。此外,php还有一个密码重新设置功能,可以检查算法(和/或成本)是否更改