如果我有哈希和原始密码,是否可以获得盐?

信息安全 密码
2021-08-30 17:15:11

如果我有哈希和原始密码,是否可以获得盐?

我的直觉是没有,但这是不可能的,还是需要很长时间?

3个回答

从中获取与从获取密码hash(salt+password)一样困难hash(salt+password)

我不太确定你为什么要找到盐,因为通常盐不被认为是秘密的。基本上,在您的情况下,盐基本上是密码,因为您不知道它是什么,而密码是您的盐(让我们把语义放在一边,因为密码可能不是全局唯一的),因为它不是秘密。

PBKDF2 标准规定至少应使用 64 位。然而,Thomas Pornin 指出:

盐必须是唯一的;这是他们唯一的工作。您应该尽可能地努力从不重复使用盐值;偶尔的重用很少是关键的,但仍应避免)。通过合理设计的密码方案,盐除了唯一性之外没有其他有用的属性;只要您不复制完全相同的位序列,您就可以随意选择它们。必须在全球范围内理解独特性。

获得或多或少唯一盐值的一种常见方法是随机生成它们,使用一个好的生成器(例如,适合加密使用的生成器,如 /dev/urandom)。如果盐足够长,冲突的风险(即重复使用盐值)就很低。如果您使用 n 位盐,一旦您达到大约 2 n/2 个生成值,碰撞的机会就变得不可忽略。这个星球上大约有 70 亿人,可以假设他们平均每个人拥有的密码少于 1000 个,因此全球散列密码的数量一定低于 2 42.7. 因此,86 位盐应该足够了。由于我们有点喜欢所谓的“安全边际”,而且,由于程序员只喜欢 2 的幂,所以让我们使用 128 位。根据上面的分析,这足以以足够高的概率确保全球唯一性,而我们对盐的要求不亚于唯一性。

请注意,它还取决于您的密码哈希算法,目前有三种公认的密码哈希算法被认为是安全的:

  • PBKDF2
  • 加密
  • bcrypt

这些是相当慢的算法,使得暴力破解盐不太可行。现在,如果您的盐是 64 位并且您的算法很慢,那么它根本不可行。假设你有一个 64 位的盐:

((2 64 ) * t)/2

其中 t 是计算单个散列所需的时间,除以 2 作为统计数据,您可能会在完成一半散列后找到它。不管怎么说那是很多时间。

因此,这将在很大程度上取决于您的盐长度和所使用的算法,如果您不知道,它实际上是多么可行。

假设您知道用于从密码和盐生成散列的散列函数和方法,如果您有原始密码和结束散列,则可以发现盐。它将使用蛮力 - 没有聪明或快速的方法来做到这一点。

在您的典型场景中,您的哈希是通过 1)对密码进行哈希处理,然后 2)将其与 salt 组合,然后 3)对密码哈希和 salt 的组合进行哈希处理。如果你知道 1) 和 3) 并且你知道盐的长度,你可以尝试所有缺失盐的组合,直到找到它。这将需要大量的计算能力和时间。

我想不出发现盐是值得的场景。盐应该是一次性使用的,你不必保护它们。有很多情况下盐是通过未加密的通道发送的,所以无论如何你都不需要发现它,如果你能得到最终的哈希值,你可能已经有了盐。即使有人实现了一个使用静态盐的加密系统(一个坏主意!),您也不必暴力破解它,因为您可能可以通过其他方式获得它。