`_time_independent_equals`是什么意思?

9 投票
1 回答
1270 浏览
提问于 2025-04-15 23:52

tornado的web模块里,有一个叫做_time_independent_equals的函数:

def _time_independent_equals(a, b):
    if len(a) != len(b):
        return False
    result = 0
    for x, y in zip(a, b):
        result |= ord(x) ^ ord(y)
    return result == 0

这个函数是用来比较安全的cookie签名的,所以才有这个名字。

不过,关于这个函数的实现,它是不是只是一个复杂的方式来表示a==b呢?

1 个回答

18

这个函数不仅仅是比较字符串,它还会尽量保持执行时间一致。

这样做在安全方面很有用,比如比较密码。如果这个函数在发现第一个不匹配的地方就返回结果,攻击者就可以尝试所有可能的第一个字节,然后知道哪个字节花的时间最长,这个就是匹配的。接着,他们可以尝试所有可能的第二个字节,找到那个花的时间最长的字节,这样可以一直重复下去,直到整个字符串被猜出来。(实际上,你需要做很多平均计算来克服网络中的随机延迟,但如果你有耐心,这种方法是有效的。)

撰写回答