具有 2 个不同哈希函数的“双重哈希”

信息安全 密码 哈希
2021-09-02 17:51:50

正在做这样的事情

sha256(sha512(password+salt))

不如只是做

sha256(password+salt)

我听说它会增加碰撞的机会。

我能想到 3 个这样做的理由

  1. 黑客不太可能拥有彩虹表
  2. sha256 返回一个比 sha512 更短的字符串(节省数据库空间)
  3. 计算哈希需要更多时间
4个回答

这感觉就像在重新发明轮子,我怀疑是否会切实提高安全性。这些函数的设计者在创建这些安全散列函数时确实考虑了所有这些方面。

  1. 添加盐有助于对抗彩虹表。使用两个散列函数而不是一个是没有用的,因为它仍然允许计算彩虹表。只有一个好的随机盐可以防止和攻击者这样做。
  2. 如果 sha256 为您生成正确的长度,请使用它。事先使用 sha512 并没有带来太多好处。无论如何,您的搜索空间/熵主要取决于密码。
  3. 这也是微不足道的。如果要增加计算量,则必须使用像 bcrypt 这样的散列函数来增加计算工作量。散列函数通常非常快。

冲突与密码散列无关。忘记碰撞。这里的安全性建立在对原像的抵抗之上而不是碰撞。

关于你的“三个理由”:

  1. 攻击者不太可能拥有彩虹表:由于您使用的是盐,因此攻击者没有彩虹表或任何其他类型的预计算表。这就是盐的全部意义:击败基于表的攻击。

  2. SHA-256 输出的短小:如果空间不足,您还可以将 SHA-512 的输出截断为适合您的任何长度。如果您保留至少 12 个字节左右(如果使用 Base64 对输出进行编码,则为16 个字符),原像抗性就足够了。

  3. 关于计算速度:这是事实的一瞥。让散列过程变慢是个好主意;但实际上,你必须让它比这慢得多。不要进行两次散列函数调用;赚两百万

当然,与其重新发明轮子,不如使用为解决密码散列问题而设计的好的算法;这意味着bcryptPBKDF2愤怒的密码学家对这些算法进行了多年的分析,他们没有发现任何致命的东西。自制的计划不能自夸。

我想你只用盐就可以了。这篇文章比我有时间详细地详细介绍了它,但是:

https://stackoverflow.com/questions/348109/is-double-hashing-a-password-less-secure-than-just-hashing-it-once

正如 Yoav 指出的那样,这种方案对您的意图基本上没有用,在最坏的情况下,甚至会通过减少给定密码的熵来损害您的安全性。

我可以通过使用多个哈希函数来提高安全性的唯一方法是分别存储所有哈希结果并在验证时将它们全部进行比较。首选不同的算法,如 sha、md5 和 bcrypt。

hash1 = sha512(密码 + salt1)

hash2 = md5(密码 + salt2)

hash3 = bcrypt(密码 + salt3)

这样,成功找到碰撞的机会非常低。