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