4

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

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

4

4 回答 4

5

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

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

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

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

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

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

希望能帮助到你。

于 2012-01-01T09:53:10.063 回答
1

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

于 2012-01-01T09:39:27.783 回答
1

通常,您执行此操作的方式如下:

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

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

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

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

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

于 2012-01-01T09:48:58.070 回答
0

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

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

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

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

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

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

1    MD5
2    SHA1
3    SHA256

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

4    SHA512

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

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

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

于 2012-01-01T09:59:01.113 回答