11

只是在寻找一些建议。我有一个拥有大约 2500 名用户的网站 - 规模虽小但不断增长。我在密码上使用 SHA1 加密来构建它。我从那以后读过 SHA1 是不安全的,并想改用 Salt 的方式说 SHA256。

有人对如何进行这样的过渡有任何建议吗?如果我可以解密密码并重新散列它们会很棒,但它似乎无法做到。

谢谢亚当

4

4 回答 4

14

通常的处理方式是这样的:

  1. 使散列密码列更大以容纳 sha256 散列,并添加“盐”列
  2. 最初将 salt 字段设置为 NULL,并调整密码检查代码,使 NULL salt 表示 sha1,非 NULL 表示 sha256
  3. 一旦 sha1-use 成功登录,使用 salt 将密码重新散列到 sha256,并更新数据库。

久而久之,用户会自行迁移到sha256;唯一的问题是用户只偶尔登录或根本不登录。对于这些,您可能想要发送提醒电子邮件,甚至威胁如果他们在第 X 天之前没有登录,他们将关闭他们的帐户(但不要给出实际原因......)

于 2011-08-07T07:23:23.370 回答
8

澄清一下,SHA 是一种散列算法,它(通常)是单向街道。您无法解密哈希,这是使用它们来验证密码的一种优势。您在转移到盐渍哈希方面走在了正确的轨道上,这就是我的做法。

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

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

于 2011-08-07T07:23:20.267 回答
2

我还有另一个建议是立即将您的密码哈希从 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 时间),但简化了迁移并提高了安全性。

于 2012-03-27T09:56:15.057 回答
1

切换到 SHA256 几乎不会让您的网站更安全。

SHA1 和 SH512 是消息摘要,它们从来都不是密码散列(或密钥派生)函数。(尽管消息摘要可以用作 KDF 的构建块,例如在带有 HMAC-SHA1 的 PBKDF2 中。)

密码散列函数应该防御字典攻击和彩虹表。

目前,唯一的标准(如 NIST 认可的)密码散列或密钥派生函数是 PBKDF2。如果不需要使用标准,更好的选择是 bcrypt 和更新的 scrypt。维基百科有所有三个功能的页面:

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

话虽如此,tdhammers 提供了有关如何处理迁移的好建议。

于 2013-12-18T13:06:03.303 回答