【发布时间】:2013-09-19 23:38:39
【问题描述】:
PHP 5.5 中的新 password_hash API 很不错,我想开始在任何地方使用它。给定一个具有旧数据库的旧项目,其中密码存储在 md5 哈希中,将旧用户密码迁移到新的、更安全的 API 的最佳方法是什么?
除了简单地提示用户在下次登录时重置密码(这对用户来说是不切实际且烦人的)之外,我还考虑过使用当前的 md5 哈希作为我所有现有用户的 password_hash() 输入的可能性。要验证这些用户的密码(在登录期间),我会将他们的输入转换为 md5 哈希,然后将其用于 password_verify()。新用户可以省去这个额外的步骤。
这是一个值得的方法吗?有没有更好的透明迁移方法,让用户不必担心密码重置,但我可以立即享受更安全的散列带来的好处?
最重要的是,采用现有的 md5 哈希(容易被暴力破解)并使用 password_hash() API 对其进行“双重哈希”是否有安全优势?
【问题讨论】:
-
通常你可以等到用户下次登录,我在这里Moving old passwords to new hashing algorithm?写了同样问题的答案。由于 MD5 对密码的哈希处理非常弱,您可以考虑存储您的 MD5 哈希
password_hash($existingMD5Hash)的 BCrypt 哈希,并在下次登录时将其迁移到password_hash($password)。 -
另见 Openwall 的 PHP password hashing framework (PHPass)。它的便携性和强化了针对用户密码的一些常见攻击。编写框架 (SolarDesigner) 的人与编写 John The Ripper 并在 Password Hashing Competition 担任评委的人是同一个人。所以他对密码攻击略知一二。
标签: php security hash passwords php-password-hash