如何在Python 2.7中安全地验证HMAC?

时间:2013-08-11 04:42:58

标签: security python-2.7 cryptography hmac

我正在使用Python 2.7并使用hmac库创建HMAC。 Python 3.3包含一个compare_digest()函数,它将比较两个摘要并抵抗时序攻击,但这在2.7中不可用。流行的建议不是自己的加密,所以是否有任何成熟的Python库提供该功能? PyCrypto似乎没有。

3 个答案:

答案 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模块)。

https://www.python.org/dev/peps/pep-0466/