Encryption 如何设计允许加密迁移的系统?

Encryption 如何设计允许加密迁移的系统?,encryption,hash,passwords,migration,saltedhash,Encryption,Hash,Passwords,Migration,Saltedhash,我想建立一个系统,允许我将加密密码(散列密码)从一个系统迁移到另一个系统。我该怎么做 比如说2个月后,我发现了一种加密技术,它的性能提高了10倍,而且目前的哈希函数毫无疑问已经被证明是完全脆弱的。如何将用户密码从一种哈希类型迁移到另一种类型(更好的) 一般来说,你不能。无法从哈希中恢复密码;这就是散列的全部要点。如果原来的散列函数已损坏,您可以恢复密码,那么您最好先恢复密码,然后使用新函数对其进行散列。通常,执行此操作的方法如下: 1) 通常使用RSA生成公钥/私钥对 2) 您可以彻底保护私钥。

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


比如说2个月后,我发现了一种加密技术,它的性能提高了10倍,而且目前的哈希函数毫无疑问已经被证明是完全脆弱的。如何将用户密码从一种哈希类型迁移到另一种类型(更好的)

一般来说,你不能。无法从哈希中恢复密码;这就是散列的全部要点。如果原来的散列函数已损坏,您可以恢复密码,那么您最好先恢复密码,然后使用新函数对其进行散列。

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

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

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

3) 无论何时存储密码,都会存储一个使用生成的公钥加密的副本

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

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

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

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

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) 如果未找到匹配项,则凭据无效且用户未登录
此迁移可能需要很长时间,因此为了加快迁移速度,您应该向用户发送电子邮件,要求他们登录或更改密码


希望有帮助。

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

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

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

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

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

假设我已经有了2个散列方法

1    MD5
2    SHA1
3    SHA256
如果我添加一个新的散列方法
SHA512
,它会变成

4    SHA512
每次用户登录时,系统将使用识别的哈希级别检查用户的密码是否与数据库中的密码相同。这里有几个例子:

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

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