提问人:Michal Charemza 提问时间:2/19/2023 更新时间:2/19/2023 访问量:151
Python 的秘密发生冲突的可能性有多大。compare_digest功能?
What's the chance of a collision in Python's secrets. compare_digest function?
问:
在 Python 的标准库中,我能找到的最接近常数时间比较的函数是 secrets.compare_digest
但这让我想知道,如果使用它来验证秘密令牌:
发生碰撞的几率有多大?例如,传递的密钥与正确的令牌不匹配,但函数返回 true 的可能性有多大?(假设传递的两个字符串的长度相同)
当使秘密变长变得毫无意义时,秘密令牌的长度是多少,至少在减轻暴力攻击方面是这样?
答:
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。
评论
constant_time_compare
secrets
hmac