我正在使用Python 2.7并使用hmac
库创建HMAC。 Python 3.3包含一个compare_digest()
函数,它将比较两个摘要并抵抗时序攻击,但这在2.7中不可用。流行的建议不是自己的加密,所以是否有任何成熟的Python库提供该功能? PyCrypto似乎没有。
答案 0 :(得分:3)
我建议您使用3.3中提供的安全比较方法。
这是一个类似于Python实现的非常的实现:
def compare_digest(x, y):
if not (isinstance(x, bytes) and isinstance(y, bytes)):
raise TypeError("both inputs should be instances of bytes")
if len(x) != len(y):
return False
result = 0
for a, b in zip(x, y):
result |= a ^ b
return result == 0
无法看到这会如何破坏任何许可证。
答案 1 :(得分:3)
对于从搜索中找到此内容的任何人,如果使用Django,您还可以使用django.utils.crypto
中的constant_time_compare
函数。
>>> from django.utils.crypto import constant_time_compare
>>> constant_time_compare("foo", "bar")
False
>>> constant_time_compare("foo", "foo")
True
这与hmac.compare_digest
有同样的警告(如果存在,实际使用hmac.compare_digest
):
注意:如果a和b的长度不同,或者发生错误,定时攻击理论上可以揭示有关a和b的类型和长度的信息,而不是其值。< / p>
答案 2 :(得分:1)
如果您可以访问Python 2.7.7,compare_digest()
最近被移植到此版本(以及2.7.9中更安全的3.x SSL模块)。