2012-01-01 79 views
4

我想建立一个系统,允许我将加密密码(哈希密码)从一个系统迁移到另一个系统。我将如何做到这一点?如何设计允许迁移加密的系统?

说2个月后,我发现一个加密好10倍,目前的散列函数已被证明毫无疑问,完全脆弱。我将如何去将用户密码从一种类型的哈希移植到另一种(更好的)。

+0

尽管没有直接回答你的问题,你应该研究像** bcrypt **和** PBKDF2 **这样的方案,它们可以指定一些迭代次数,从而使散列计算任意慢。 – SimonJ 2012-01-03 15:00:24

回答

5

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

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

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

告诉别人,你过时散列法是MD5和你想用更安全的sha1来取代它,这是你做了什么:

  • 用户登录时,你哈希其与方法(SHA1)和盐密码。
    • a)如果找到匹配项(相应的用户名和密码以及方法sha1),则记录用户。
    • b)中如果匹配发现:
      • 1)你散列与方法(MD5)和盐。
        • a)如果发现匹配(对应的用户名和密码和方法MD5),则散列与方法(SHA1)和盐的密码,并且相应地更新数据库。用户被记录。
        • b)如果匹配是而不是找到,则凭据无效且用户未登录。

这种迁移可能需要很长的时间,所以要加快步伐,你应该电子邮件用户,要求他们登录或更改他们的密码。

希望它有帮助。

+0

+1用于在每个用户的基础上存储散列函数。 – halfer 2012-01-02 10:01:59

+0

另外,考虑锁定/删除一年内还没有被访问过的账户,否则你会被一堆属于忽略你的电子邮件的用户的可破解密码... – SimonJ 2012-01-03 14:47:08

+0

这正是方法我在寻找! +1 – danyim 2013-09-23 22:48:39

1

一般来说,你不能。你不能从哈希中恢复密码;这是一个散列的整个点。如果原始散列函数如此破碎以至于您可以恢复密码,那么您可能只需要这样做,然后使用新函数对它们进行散列。

1

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

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

2)彻底保护私钥。你永远不会在线存储它。 (你可能想把它分成两部分,并把它们分给不同的人,你可能想要使用安全的秘密共享,你可能想用一个令牌来保护它。)

3)任何时候你存储密码,你还会存储使用您生成的公钥加密的副本。

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

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

0

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

如果您的系统需要频繁升级,我会做以下操作。

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

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

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

比方说,如果我有2种哈希方法已经

1 MD5 
2 SHA1 
3 SHA256 

如果我在一个新的散列方法SHA512增加,它会成为

4 SHA512 

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

  • 如果密码哈希保持一致,但用户的散列水平并不是最高的哈希级别的系统提供,然后用最高的散列用户即纯文本输入密码哈希方法级别并将用户的哈希级别设置为最高哈希级别。用户然后被认证。
  • 如果密码哈希值匹配,并且用户的哈希级别是最高哈希级别,则用户通过身份验证。
  • 如果密码哈希完全不匹配,则用户被拒绝。

这意味着无论何时升级系统的散列级别,用户的密码只会在其下一次验证时升级到最高级别。