我正在使用各种不安全/可怕的不安全的基于MD5的密码哈希更新几个项目.我现在至少对最佳做法有所了解,但我仍然想知道我做错了什么.我还没有看到我在其他地方使用的具体过程,但至少有一个SO用户似乎想要做类似的事情.就我而言:
密码哈希是使用bcrypt生成的.(因为正确的选项似乎是bcrypt,scrypt,或者pbkdf2和bcrypt在PHP中最容易被我访问.)
每个哈希使用不同的随机盐.(防止攻击者生成使用单个静态盐计算的自定义彩虹表.)
散列,算法设置和salt存储在一起.(因为这就是PHP的crypt函数给我的哈希值.)
成功登录后,将使用新的随机盐重新计算哈希值.
这是我想知道的最后一步.我的目的是随着时间的推移允许更新散列算法,以便定期登录的用户将以最安全的格式存储密码.
我的问题是:
这是浪费时间吗?
这样做有危险吗?
更新
Re delnan 的评论:如果您要重新散列已经散列的密码,请不要 - 您永远不知道在链接散列时可能会出现并发现哪些漏洞。显然,另一方面是您每次验证用户机密时都需要计算整个哈希链 - 因此只需重新哈希明文即可。
原来的
我读到一半就投了赞成票。看起来你是一个为了从事这种工作而提出正确问题的人。
因此无法保证完美的安全性。曾经。但我相信你已经知道了。这就是为什么我只想添加一件事:
而且,严格来说,如果您在每次登录时重新哈希的唯一原因是始终使用最新更新存储密码,那么是的 - 您的方法是浪费时间,假设您不会在每个用户登录时更新算法。因此,连续两次登录将使用相同的算法和(假定的)安全性进行重新哈希。在重新散列上浪费了几个时钟周期。严格来说,它还没有优化。如果系统算法比用户的哈希算法新,为什么不在密码存储中包含算法版本,并在登录重新哈希时包含算法版本。