Python 的秘密发生冲突的可能性有多大。compare_digest功能?

What's the chance of a collision in Python's secrets. compare_digest function?

提问人:Michal Charemza 提问时间:2/19/2023 更新时间:2/19/2023 访问量:151

问:

在 Python 的标准库中,我能找到的最接近常数时间比较的函数是 secrets.compare_digest

但这让我想知道,如果使用它来验证秘密令牌:

  • 发生碰撞的几率有多大?例如,传递的密钥与正确的令牌不匹配,但函数返回 true 的可能性有多大?(假设传递的两个字符串的长度相同)

  • 当使秘密变长变得毫无意义时,秘密令牌的长度是多少,至少在减轻暴力攻击方面是这样?

Python 安全 哈希 加密

评论

0赞 Kelly Bundy 2/19/2023
“例如,传递与正确令牌不匹配但函数返回 true 的秘密的可能性有多大?”-哼?零。我错过了什么?
0赞 Michal Charemza 2/19/2023
@KellyBundy 对我来说,该函数的名称表明它实际上并不比较字节,而是字节的摘要,因此哈希函数的输出在字节上运行。哈希函数可能会发生冲突,即函数的两个不同输入导致相同的输出。假设compare_digest使用 MD5,那么 crypto.stackexchange.com/questions/1434/... 有一些冲突示例(所以我怀疑compare_digest不使用 MD5!
1赞 Kelly Bundy 2/19/2023
该函数的描述是“如果字符串或类似字节的对象 a 和 b 相等,则返回 True,否则返回 False”。与散列无关。比较给定的 a 和 b。它们应该已经是摘要,这就是函数名称的含义。
2赞 Kelly Bundy 2/19/2023
好吧,当然你可以将它用于其他用途,但这是预期的用途。是的,可能是一个更好的名字。constant_time_compare
2赞 Kelly Bundy 2/19/2023
我应该说“引用的 hmac.compare_digest”。相同的函数名称,不同的模块。该模块仅从 .secretshmac

答:

1赞 arrmansa 2/19/2023 #1

Secrets 使用 HMAC,而 HMAC 使用 hashopenSSL。这使用函数来比较事物,该函数使用 openssl 的CRYPTO_memcmp。文档没有提到任何关于概率的信息。我不擅长阅读汇编代码提交,但除了直接比较内存之外,它似乎没有做任何事情。所以我不明白为什么它会有冲突的可能性,因为不涉及散列_tscmp

至于暴力攻击的问题 - 假设假设我们在 2TB/s 的现代 GPU 的最大 GPU 带宽下进行了比较,即 1.6e+13 位,如果我们将其乘以 1 年的时间,即 ~ 3.1e+7 秒,我们得到每个 GPU 每年 ~5e21 位的比较。log2(5e21) = 72 ->这意味着理论上我们可以在 1 年内用 GPU 破解 72 位密钥。(这可能是不可能的,因为 GPU 不是为此而设计的,但 ASIC 可能具有这种性能)。按照 72 个/年/设备的估计值 ->您可以简单地将设备数量增加一倍或每比特增加的年数。(或者,假设效率每年翻一番,您可以在年数上增加 1)。在这里,128 位提供 20 年的倍增效率 + 10 亿个 GPU / 10,000 台超级计算机。

附加说明 - >顶级超级计算机的失败次数是每秒 1e18 = 100,000 个 GPU(它确实有 8,730,112 个内核或 136,408 个 AMD 64c CPU......

在不切实际的尺度上>宇宙可能包含 1e82 个原子,一个中子可以持续 1e200 年,即 ~1e207 秒。假设每个原子可以在 1e-44 秒(平板时间)内进行比特比较,理论上我们可以计算 1e333 比特。这是 1106 的密钥大小。我怀疑 1024 的密钥大小应该足够了,假设将宇宙变成计算机的效率是 1e-24。

评论

0赞 Michal Charemza 2/19/2023
“所以我不明白为什么它会有冲突的概率,因为不涉及哈希”——所以函数的名称,compare_digest,感觉有点误导?
0赞 arrmansa 2/19/2023
@MichalCharemza hmac 文档确实更清楚地表明它只是 ==,但可以抵抗定时攻击。
0赞 President James K. Polk 2/20/2023
您计算的是前像电阻,但碰撞电阻是不同的计算。通常,对于基数为 n 的输出空间,精心设计的哈希函数的抗碰撞能力高达 O(n**0.5)。