只是在寻找一些建议。我有一个拥有大约 2500 名用户的网站 - 规模虽小但不断增长。我在密码上使用 SHA1 加密来构建它。我从那以后读过 SHA1 是不安全的,并想改用 Salt 的方式说 SHA256。
有人对如何进行这样的过渡有任何建议吗?如果我可以解密密码并重新散列它们会很棒,但它似乎无法做到。
谢谢亚当
通常的处理方式是这样的:
久而久之,用户会自行迁移到sha256;唯一的问题是用户只偶尔登录或根本不登录。对于这些,您可能想要发送提醒电子邮件,甚至威胁如果他们在第 X 天之前没有登录,他们将关闭他们的帐户(但不要给出实际原因......)
澄清一下,SHA 是一种散列算法,它(通常)是单向街道。您无法解密哈希,这是使用它们来验证密码的一种优势。您在转移到盐渍哈希方面走在了正确的轨道上,这就是我的做法。
获取密码的唯一方法是让用户自己输入密码。当用户访问您的站点并登录时,请一一更新密码。在您的身份验证方法中,我将执行您现在正在执行的哈希,并将其与现有字段中的内容进行比较(这里没有新内容)。假设它匹配,继续使用 SHA256 加盐/重新散列,并更新数据库中的密码字段。如果您愿意,请在您的用户表中保留一些信息来跟踪哪些用户已更新。
我做了很多假设,但这就是我过去解决哈希算法舞的方式。祝你好运!
我还有另一个建议是立即将您的密码哈希从 SHA1 迁移到 SHA256,而无需等待用户再次访问该站点以重新哈希密码。更改将是一次性密码哈希迁移并更改为您的登录验证功能。
假设您的密码哈希是使用以下函数生成的:密码 + salt [Sha1]-> Hash-sha1
要迁移到 Sha256,您可以使用以下算法转换您的密码哈希:
Hash-sha1 + salt [Sha256]-> Hash-sha256 (salt 用来增加输入的复杂度。)
根据 sha256 函数的可接受值,您可以考虑将 Hash-sha1 编码为 base64 以用于可打印的 ascii。
对于您的登录验证功能,应使用以下算法对密码进行哈希处理:
密码 + salt [sha1] -> hash-sha1 + salt [sha 256] -> hash-sha256
缺点是两次散列(使用一些 CPU 时间),但简化了迁移并提高了安全性。
切换到 SHA256 几乎不会让您的网站更安全。
SHA1 和 SH512 是消息摘要,它们从来都不是密码散列(或密钥派生)函数。(尽管消息摘要可以用作 KDF 的构建块,例如在带有 HMAC-SHA1 的 PBKDF2 中。)
密码散列函数应该防御字典攻击和彩虹表。
目前,唯一的标准(如 NIST 认可的)密码散列或密钥派生函数是 PBKDF2。如果不需要使用标准,更好的选择是 bcrypt 和更新的 scrypt。维基百科有所有三个功能的页面:
https://crackstation.net/hashing-security.htm上的页面包含对密码安全性的广泛讨论。
话虽如此,tdhammers 提供了有关如何处理迁移的好建议。