Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在Python中,HMAC比较怎么可能不是常数时间呢?_Python 3.x_Security_Hmac_Timing Attack - Fatal编程技术网

Python 3.x 在Python中,HMAC比较怎么可能不是常数时间呢?

Python 3.x 在Python中,HMAC比较怎么可能不是常数时间呢?,python-3.x,security,hmac,timing-attack,Python 3.x,Security,Hmac,Timing Attack,Python有一种专门用于比较HMAC以防止定时攻击的方法: 我在这里读到了定时攻击: 我的问题是,时间怎么可能不是常数呢?为了比较它,需要计算实际的HMAC,而不是一次计算摘要1个字符,对吗?最后,它只是一个简单的字符串比较,比我测试中的实际HMAC计算快2个数量级。那么攻击面到底在哪里呢?如果我不使用hmac.compare_digest(),有人能举个例子说明实际的漏洞在哪里吗 最后,它只是一个简单的字符串比较,比我测试中的实际HMAC计算快2个数量级 但它不是恒定的时间。仅仅因为他们做得

Python有一种专门用于比较HMAC以防止定时攻击的方法:

我在这里读到了定时攻击:

我的问题是,时间怎么可能不是常数呢?为了比较它,需要计算实际的HMAC,而不是一次计算摘要1个字符,对吗?最后,它只是一个简单的字符串比较,比我测试中的实际HMAC计算快2个数量级。那么攻击面到底在哪里呢?如果我不使用
hmac.compare_digest()
,有人能举个例子说明实际的漏洞在哪里吗

最后,它只是一个简单的字符串比较,比我测试中的实际HMAC计算快2个数量级

但它不是恒定的时间。仅仅因为他们做得很快并不意味着差异是不可测量的。对于
字节
值,Python首先测试等长字节和等首字节,然后使用测试其余字节。对于字符串,Python比较长度,然后比较种类(如果字符串每个字符使用1、2或4个字节),然后还使用
memcmp

memcmp
的Linux手册页明确指出:

不要使用
memcmp()
来比较安全关键数据,例如 加密机密,因为所需的CPU时间取决于 相等字节数。而是执行比较的函数 在恒定的时间内是必需的。一些操作系统提供了这样一种功能 函数(例如,NetBSD的
consttime_memequal()
),但没有此类函数 在POSIX中指定。在Linux上,可能需要实现 (这是一个功能本身。)

一个有足够决心的攻击者可以利用这一弱点找出您存储的哈希值与它发送的数据的哈希值

定时攻击使伪造签名成为可能。例如,服务将授权信息存储在与客户端共享的令牌中。如果客户机可以更改此令牌,他们就可以获得本来无法获得的访问权限。为了防止这种情况,使用HMAC签名对令牌进行签名,让服务器在接受返回的令牌为有效令牌之前验证它。如果授权数据与签名不匹配,则拒绝令牌

如果服务器执行此操作:

auth_data, signature = split_token(token)
expected = hmac_signature(auth_data)
if signature == expected:
    # ...

然后,攻击者可以检测伪造签名中有多少字符与预期签名匹配,并进行相应调整。它们以
XXXXX:000000…
开头,然后尝试
XXXXX:1000000…
等,直到服务所用的时间增加,表明它们具有匹配的第一个字符。然后可以修改第二个字符,直到完整签名匹配。

因为Python
=
相等测试不能保证它是常数时间。所以基本上,您承认这是一个纯粹的技术正确性问题,实际上不是一个实际问题。。。这和我想的差不多。嗯,不,我不是。我要告诉你的是,使用
==
会让你面临oracle定时攻击。如果攻击者已经拥有了摘要,这难道不是毫无意义吗?他们可以在自己的计算机上执行此操作。@dvtan:不,攻击者没有摘要,它正试图找出如何创建新哈希。@dvtan:您链接到一篇文章,该文章准确地解释了攻击者没有摘要,也不想要摘要,它想知道如何为他们控制的数据生成一个新的摘要。哦,对了,我在考虑对密钥进行暴力攻击。。。我的错误是它在混乱中伤害了它自己。我仍然认为这太理论化了,随机方差会完全淹没实际实践中的任何时间差