【问题标题】:How to design system to allow migration of encryption?如何设计系统以允许加密迁移?
【发布时间】:2012-01-01 09:37:05
【问题描述】:

我想建立一个系统,允许我将加密密码(哈希密码)从一个系统迁移到另一个系统。我该怎么做?

说 2 个月后,我发现了一个好 10 倍的加密,并且当前的哈希函数已被毫无疑问地证明,完全易受攻击。我将如何将用户密码从一种类型的哈希迁移到另一种(更好的)。

【问题讨论】:

  • 虽然不直接回答您的问题,但您应该研究像 bcryptPBKDF2 这样的方案,它们可以让您指定迭代次数,从而计算哈希任意慢。

标签: encryption hash passwords migration saltedhash


【解决方案1】:

您可以慢慢地使用以下技术从一种方法迁移到另一种方法。我不能保证它的质量,所以请对它持保留态度(双关语不是故意的)。

例如,考虑下表,它存储用户:

id    name    password    salt    hashmethod
--------------------------------------------
1     alice   ABC52...    ABD...  md5
2     bob     28DHF...    Z+d...  sha1
...

假设你的过时哈希方法是md5,你想用更安全的sha1替换它,这就是你要做的:

  • 用户登录后,您使用 new 方法 (sha1) 和 salt 对其密码进行哈希处理。
    • a) 如果找到匹配项(对应的用户名和密码以及方法 sha1),则记录用户。
    • b) 如果找到匹配项:
      • 1) 您使用 old 方法 (md5) 和 salt 进行哈希处理。
        • a) 如果找到匹配项(对应的用户名和密码以及方法 md5),您使用 new 方法 (sha1) 和 salt 对密码进行哈希处理,并相应地更新数据库。用户已登录。
        • b) 如果未找到匹配项,则凭据无效且用户未登录。

此迁移可能需要很长时间,因此为了加快迁移速度,您应该向您的用户发送电子邮件,要求他们登录或更改密码。

希望对你有帮助。

【讨论】:

  • 此外,请考虑锁定/删除(例如)一年未访问的帐户,否则您将遇到一堆属于忽略您电子邮件的用户的可破解密码。 .
  • 这正是我正在寻找的方法! +1
【解决方案2】:

一般来说,你不能。您无法从哈希中恢复密码;这就是哈希的全部意义。如果原来的散列函数被破坏了,你可以恢复密码,那么你不妨这样做,然后用新函数散列它们。

【讨论】:

    【解决方案3】:

    一般来说,你这样做的方式如下:

    1) 您生成公钥/私钥对,通常使用 RSA。

    2) 您彻底保护了私钥。您永远不会在线存储它。 (您可能希望将其分成两半并将其信任给不同的人。您可能希望使用安全秘密共享。您可能希望将其保护在令牌中。)

    3) 每当您存储密码时,您也会存储使用您生成的公钥加密的副本。

    4) 如果将来需要恢复明文密码,您可以恢复私钥并解密存储的密码副本。

    请注意,这是您如何操作的技术描述。你如何做到安全很复杂,取决于你的具体情况。例如,您必须考虑攻击者用他自己的公钥替换您的公钥的威胁模型。

    【讨论】:

      【解决方案4】:

      这仅适用于使用单向散列方法存储密码并在身份验证时比较散列的系统。

      如果您的系统需要频繁进行此类升级,我会执行以下操作。

      正如 Taymon 所指出的,散列是一种方法,您无法从散列中检索原始纯文本。

      在我存储用户信息和密码的数据库表中,我将包含一个哈希级别整数字段。这表明用户正在使用哪种散列方法。

      当系统添加新的哈希方法时,最高哈希级别将递增。

      假设我已经有 2 种散列方法

      1    MD5
      2    SHA1
      3    SHA256
      

      如果我添加一个新的哈希方法SHA512,它会变成

      4    SHA512
      

      每次用户登录时,系统都会使用识别的哈希级别检查用户的密码是否与数据库中的密码相同。这里有几种情况:

      • 如果密码哈希匹配,但用户的哈希级别不是系统提供的最高哈希级别,则使用最高级别的哈希方法对用户输入的密码即明文进行哈希,并设置哈希级别用户的最高哈希级别。然后对用户进行身份验证。
      • 如果密码哈希匹配并且用户的哈希级别是最高哈希级别,则用户通过身份验证。
      • 如果密码哈希完全不匹配,则拒绝用户。

      这意味着每当您升级系统的哈希级别时,用户的密码只会在下次身份验证时升级到最高级别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-09
        • 2019-11-26
        • 1970-01-01
        • 2022-08-04
        • 2016-12-11
        • 1970-01-01
        • 2012-10-18
        • 2018-03-30
        相关资源
        最近更新 更多