9

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

4

1 回答 1

18

该函数不只是比较字符串,它会尝试始终花费相同的时间来执行。

这对于比较密码等安全任务很有用。如果函数在第一个不匹配的字节上返回,攻击者可以尝试所有可能的第一个字节并知道耗时最长的那个是匹配的。然后他们可以尝试所有可能的第二个字节,并知道耗时最长的那个是匹配的。这可以重复,直到推导出整个字符串。(实际上,你必须做很多平均来克服网络中的随机延迟,但如果你有耐心,它会起作用。)

于 2010-06-12T03:02:28.667 回答