10

我正在使用各种不安全/极不安全的基于 MD5 的密码哈希来更新几个项目。我现在至少对最佳实践有了更好的了解,但我仍然想知道我是否做错了什么。我还没有看到我在其他地方使用的具体流程,但至少有一个 SO 用户似乎想做类似的事情。就我而言:

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

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

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

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

这是我想知道的最后一步。我的意图是允许随着时间的推移更新散列算法,以便定期登录的用户将他们的密码存储在最安全的可用格式中。

我的问题是:

  1. 这是浪费时间吗?

  2. 这样做有什么危险吗?

4

4 回答 4

3

UDPATE

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

原来的

重新散列密码是没有用的,因为如果攻击者已经掌握了散列,你就不会阻止任何事情。

考虑以下:

  • 我是您网站上的用户,其哈希值为:1234567890。
  • 一些攻击者掌握了该哈希值。
  • 我再次登录并更改了哈希。
  • 攻击者并不关心哈希值的变化,因为他只需要一个哈希值就可以尝试破解。

所以什么都没有被阻止。攻击者仍然拥有哈希并且仍然可以尝试破解它。可能的攻击者只对最终结果(密码)感兴趣,而不对哈希感兴趣。

于 2012-08-13T15:20:07.577 回答
3

更新

Re delnan 的评论:如果您要重新散列已经散列的密码,请不要——您永远不知道在链接散列时可能会出现和发现哪些漏洞。显然,另一方面是每次验证用户密码时都需要计算整个散列链——所以只需重新散列明文。

原来的

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

  1. 不是浪费时间。
  2. 总是有危险。有人可以通过折磨或更可能的社会工程来获取您用户的密码。有人可以访问大量资源,并且您的影子密码文件仍然可以破解密码。有人可能会破坏您的服务器,秘密插入一个木马,在成功登录时拦截用户明文密码。

因此,无法保证完美的安全性。曾经。但我相信你已经知道了。这就是为什么我只想添加一件事:

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

而且,严格来说,如果您在每次登录时重新散列的唯一原因是始终使用最新更新存储密码,那么可以 - 您的方法是浪费时间,假设您不会在每个用户登录时更新您的算法。因此,对于连续两次登录,将会有使用相同算法和(假定的)安全性的重新散列。重新散列浪费了几个时钟周期。严格来说,它没有优化。为什么不在您的密码存储中包含一个算法版本,如果系统算法比用户的哈希算法更新,则在登录 rehash 时包含。

于 2012-08-13T15:23:15.603 回答
0
  1. 如果有人可以访问哈希,每次更改它都不会有任何帮助,除非该人可以访问每个更新并愿意重新开始。这不会发生,如果发生了,那么您将遇到更大的问题。

  2. 不,没有危险,只会浪费服务器资源。

于 2012-08-13T15:22:56.747 回答
-1

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

于 2016-08-08T06:22:49.837 回答