2012-08-13 74 views
10

我正在使用各种不安全/可怕的不安全的基于MD5的密码哈希来更新几个项目。我现在至少对最佳做法有了更多的了解,但我仍然怀疑自己是否做错了什么。我还没有看到我在别处使用的具体过程,but at least one SO user seems to want to do something similar。在我的情况下:在登录时重新存储密码有没有什么好处?

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

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

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

  • 成功登录后,散列值将用新的随机盐重新计算。

这是我想知道的最后一步。我的意图是随着时间的流逝允许更新哈希算法,因此定期登录的用户将以最安全的格式存储他们的密码。

我的问题是:

  1. 这是浪费时间?

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

回答

3

UPDATE

重新delnan的评论:如果您正在重新散列已经散列密码,不要 - 你永远不知道会发生什么样的漏洞和链接起来哈希被发现。显然,另一方面是每次验证用户密码时都需要计算整个哈希链 - 所以只需重新哈希明文。

ORIGINAL

我通过阅读中途upvoted。看起来你是一个正在问正确的问题做这种工作的人。

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

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

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

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

+0

RE#2我认为OP意味着每次登录时使用新盐进行重新哈希处理的具体陷阱或漏洞。 – delnan 2012-08-13 15:25:29

+0

我加了两句话来谈论那个,谢谢@delnan – 2012-08-13 16:06:34

+0

我正在重新哈希一个哈希密码,但不是以直接关系到这个问题的方式。作为使用不安全密码的所有用户的一次性更新,我存储了散列密码的散列(因此我有md5的bcrypt),这些散列密码被标记出来以便我可以检测到它。这是我在每次登录时开始重新哈希密码的原始原因,它允许用户登录时更新这些特殊情况。 – flergl 2012-08-13 16:34:56

3

UDPATE

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

ORIGINAL

换汤不换药的密码是没用的,因为如果攻击者已经得到了你不会阻止任何哈希的保持。

考虑以下几点:

  • 我是一个用户在你的网站与哈希:1234567890
  • 一些攻击者获取哈希的保持。
  • 我再次登录并更改散列。
  • 攻击者不关心哈希变化,因为他只需要一个哈希来试图破解。

因此没有阻止。攻击者仍然有散列,仍然可以尝试破解它。一个可能的攻击者只对最终结果(密码)感兴趣,而不是在哈希中。

+0

重新计算新算法的哈希值是好的,但我只会在算法更改时更新哈希值。每次更改散列可能会让其他开发人员认为这更安全,但事实并非如此。但是,它不会损害安全性。 – Steven 2012-08-13 15:42:05

+0

准确地说我的观点:) – PeeHaa 2012-08-13 15:43:52

0
  1. 如果有人获得对散列的访问权限,每次都不会有所帮助,除非该用户有权访问每个更新并且愿意重新开始。这不会发生,如果它发生了,那么你会遇到更大的问题。

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

-1

实际上,它防止新手cookie攻击者将cookie复制到浏览器中以模仿...因此,如果所有者稍后登录并更改了散列值,则会将攻击者记录下来,从而减少用户帐户的破坏。