PKCS#5 盐隐私?

信息安全 密码学 加密 密码
2021-08-14 12:27:06

可能重复:
密码散列添加盐+胡椒还是盐足够?

在 PKCS5 V2.0 标准的官方文档中,我们可以看到“盐可以看作是从密码派生的大量密钥的索引,不需要保密。”

“不必保密”的部分很有趣。

由于 salt 用于添加大量密码可能性(或者如果两个用户具有相同的密码,则创建两个不同的密钥),让 salt 不安全的目的是什么?

我知道,通常情况下,攻击者无法访问盐,因此找到正确密码会使他的工作复杂化。但如果攻击者知道盐,那么“魔法”在哪里?知道盐就像执行传统的字典攻击(如果我们排除迭代计数)!

有什么我不明白的吗?我知道知道盐不会破坏安全性,但是说它“不需要保密”对我来说听起来很奇怪。

2个回答

保持私密性很困难(即昂贵)。对于通常称为“密钥”的机密数据元素(当所述密钥可以存储在基于人类的系统中时有时称为“密码”),我们必须考虑整个密钥生命周期:它是如何、何时以及在何处创建、存储、复制和删除。在某些(许多!)上下文中,正确的密钥管理需要物理防篡改存储系统(智能卡、HSM...);这些不长在树上。没有任何理由不想保密。相反,我们需要明确的理由来使某些东西值得私有化。

不是密钥(否则我们会称它为密钥,而不是盐)。它的要点是对于每个实例都是不同的,即使使用相同的键也是如此。salt 可以防止许多类型的成本共享,其中攻击者可以攻击N个受保护元素(例如散列密码),其成本低于攻击一个元素的N倍。成本分摊的一种形式是预先计算的表,例如“彩虹表”。盐通过对每个实例都是唯一的来克服这一点。

通过允许公开盐,我们可以更容易地为每个实例拥有一个唯一的盐。管理这么多密钥会非常困难,但对于公共元素,我们只需调用 PRNG 并随时存储值,无需多言。

“不必保密”

它们可能意味着“不必用强密码术加密”之类的意思;但不是“应该积极向所有人宣传”。

加盐的主要目的是避免分摊成本成本分摊是预先计算一个哈希表,然后使用该哈希表一次攻击所有用户帐户。(或者更糟糕的是,有效地攻击许多系统上的用户帐户。)

大而随机的盐有效地防止成本分摊。即使它以明文形式存储在密码的散列表示旁边,它也会这样做。

可以这样想:通过巨大的数据集执行搜索需要时间;RAM 大小和 RAM I/O 速度是有限的。在某些时候,预先计算的哈希表的大小变得令人望而却步。然后盐就达到了它的目的,无论它是否保密。

(当哈希表方法不可行时,攻击者可能会转而只运行哈希函数。通过在一组廉价机器上并行散列潜在密码来进行 Fx 蛮力攻击。)