选择比哈希输出更长的密码是否有意义?

信息安全 密码 哈希
2021-08-22 17:27:50

我们以 MD5 为例:

它输出一个 128 位的散列。选择本身长于 128 位的输入(密码)是否有意义(理论上)?

它会以任何方式增加碰撞的可能性吗?

我知道 MD5 被破坏了,那么像 bcrypt 或 scrypt 这样的更现代的算法呢?

3个回答

如果您考虑一组大小为P的潜在密码,其哈希函数具有N个可能的输出值,那么当P小于N的平方根时,该集合中至少存在一次冲突的概率非常低,并且相当高。生日问题正如维基百科页面所说,该概率大约等于1-e -P 2 /2·N

带数字:如果使用由 10 个字符(大写字母、小写字母和数字)组成的密码,则P = 62 10 = 839299365868340224使用 128 位散列函数,N = 2 128上面的公式意味着在所有这些密码中可能至少存在一个冲突对,概率接近 0.1%。另一方面,如果您在密码中添加一个字符(即潜在密码的长度为 11,而不是 10),那么至少存在一次冲突的概率上升到 98.1%。

现在所有这些都是关于发生碰撞的概率不是发生碰撞的可能性。

冲突与密码散列无关密码散列适用于原像抗性:给定散列,猜测相应密码的难易程度。请注意,我说的是“a”,而不是“the”:对于攻击者来说,他是否找到与用户选择的密码相同的密码并不重要;他只想要一个授予访问权限的密码,任何与哈希输出匹配的密码都可以解决问题。

请注意,虽然 MD5 因碰撞而“损坏”,但对于原像并非如此(好吧,对于原像,它“略微凹陷”,但就本问题而言并不显着)。

有两种方法可以打破原像电阻:

  1. 猜密码。这意味着尝试所有可能的密码,直到找到正确的密码。如果有P个具有均匀概率的可能密码,那么这最多花费P/2,因为用户确实选择了其中一个密码,并且攻击者平均需要尝试其中的一半才能击中那个确切的密码。

  2. 幸运。尝试密码(随机的、连续的……没关系),直到找到匹配的哈希值。这具有平均成本N/2

密码散列强度将不超过两者中的较低值。从这个意义上说,使用一组大于散列函数输出的可能密码(例如,对于 128 位散列函数, P > 2 128)不会带来额外的安全性,因为超出这一点,“走运”对于攻击者来说,这种攻击比“猜密码”攻击更划算,而且“幸运”攻击并不取决于用户实际选择密码的方式。请注意我说的是“密码集的大小”而不是“密码长度”。上面的所有分析都是基于可以选择多少个密码值,具有统一的概率。如果您只使用 200 个字母的密码,但您可能只选择一万个(例如,因为每个“密码”都是您最喜欢的书中的一个句子,并且攻击者知道那本书),那么潜在密码集的大小是 10000,而不是 62 200

在实践中,P受限于用户的大脑(用户必须记住密码)并且总是低于N。“非常强”的密码是来自选择过程的密码,它使用2 80或更高的P ;这足以保证安全,但远低于MD5的 2 128或 bcrypt 的 2 192但是期望普通用户平均选择非常强的密码似乎是不现实的。相反,我们必须处理弱密码,P约为 2 30左右(意思是:尝试十亿个可能的密码,你将破解一半用户的密码)。缓解措施然后是慢散列(使每个猜测都变得昂贵)和(不允许攻击者以降低的成本并行攻击多个密码)。看到这个答案

散列将无限空间(即可能的数据输入)减少到有限空间(即可能的散列)。所以总会有碰撞。

从技术上讲,如果您将输入集的大小限制为小于 2 h,其中h是您的哈希输出的大小(以位为单位),那么您会减少发生冲突的机会。事实上,当len(m)趋向于h 时,当对集合M中的所有值进行彻底散列时,发生冲突的概率趋向于 1。

话虽如此,给定足够大的h值,彻底散列所有M是非常不切实际的 - 对于 SHA256,您需要执行 2 255次操作,然后才能达到 50% 的与预先选择的值发生冲突的机会。

要记住的重要一点是,对于长于h的字符串,您的安全性永远不会低于h位消息,假设哈希中没有导致多块消息不安全的特定漏洞。

坦率地说:是的,从统计上讲,比您的哈希输出长度短的消息确实具有较低的冲突机会,但是找到该冲突所需的操作数与长度成比例。

是的,选择长于哈希输出大小的密码绝对有意义。为什么?

  1. 密码散列算法旨在产生在计算上与均匀随机性无法区分的输出。从窃取您的密码数据库的攻击者的角度来看,密码标签看起来像随机字节序列,没有比其他任何一个都更有可能。
  2. 明文密码非常不统一——一些字节序列比其他一些字节序列更有可能成为密码。

这告诉您的是,典型的n字节密码的熵比可以编码成n字节密码标签的熵要低得多。简单来说,明文密码是非常可预测的,因此可以轻松地将明文n字节密码的真实数据库压缩到每个密码少于n字节。所以从某种意义上说,n字节密码并没有用完n字节散列提供的所有容量。