想要将网站密码加密从SHA1转换为SHA256

Want to Convert a Website password Encryption from SHA1 to SHA256

只是寻找一些建议。
我有一个大约有2500个用户的网站-规模虽小,但还在不断增长。
我通过在密码上使用SHA1加密来构建它。
从那以后,我已经读过SHA1是不安全的,并且想更改为SHA256加盐。

有人对如何进行这样的过渡有任何建议吗?
如果我可以解密密码然后重新哈希密码,但看起来还不行,那就太好了。

谢谢
亚当


解决此问题的通常方法是:

  • 使"哈希密码"列更大以容纳sha256哈希,然后添加"盐"列
  • 最初将salt字段设置为NULL,并调整密码检查代码,以使NULL salt表示sha1,非NULL表示sha256
  • 一旦使用sha1成功登录,请用salt将密码重新哈希化为sha256,然后更新数据库。
  • 随着时间的流逝,用户将自行迁移到sha256。唯一的问题是仅偶尔或根本不登录的用户。对于这些,您可能想发送一封提醒电子邮件,甚至威胁说如果他们在X天之前未登录就关闭他们的帐户(不过,请不要提供实际的原因...)


    为了明确起见,SHA是一种哈希算法,(通常)是一条单向街道。您无法解密哈希,这是使用哈希来验证密码的一种优势。您正朝着加盐散列的方向前进,这就是我的做法。

    获取密码的唯一方法是让用户自己输入密码。当用户访问您的网站并登录时,请一个个更新密码。在您的身份验证方法中,我将执行您现在正在执行的哈希,并将其与现有字段中的哈希值进行比较(此处无新内容)。假设它匹配,请继续使用SHA256进行加盐/重新哈希处理,并更新数据库中的密码字段。如果需要,请在用户表中保留一些跟踪哪些用户已更新。

    我做了很多假设,但这就是我过去解决哈希算法之舞的方式。祝好运!


    我还建议您立即将密码哈希从SHA1迁移到SHA256,而不必等待用户再次访问该站点以重新哈希密码。更改将是一次密码哈希迁移,并更改为您的登录验证功能。

    假设您使用以下功能生成了密码哈希:password + salt [Sha1]-> Hash-sha1

    要迁移到Sha256,可以使用以下算法转换密码哈希:

    Hash-sha1 +盐[Sha256]-> Hash-sha256(盐用于增加输入的复杂性。)

    根据您的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://zh.wikipedia.org/wiki/PBKDF2
    • https://zh.wikipedia.org/wiki/Bcrypt
    • https://zh.wikipedia.org/wiki/加密

    https://crackstation.net/hashing-security.htm上的页面包含有关密码安全性的广泛讨论。

    话虽这么说,tdhammers为如何处理迁移提供了很好的建议。