Что означает это `_time_independent_equals`? - PullRequest
9 голосов
/ 12 июня 2010

В модуле 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 голосов
/ 12 июня 2010

Эта функция не просто сравнивает строки, она всегда выполняет одно и то же время.

Это полезно для задач безопасности, таких как сравнение паролей. Если функция вернула первый несовпадающий байт, злоумышленник может попробовать все возможные первые байты и узнать, что самый длинный из них является совпадением. Тогда они могли бы попробовать все возможные вторые байты и знать, что самый длинный из них - это совпадение. Это может повторяться до тех пор, пока не будет выведена вся строка. (На самом деле вам приходится много усреднять, чтобы преодолеть случайные задержки в сети, но это работает, если вы терпеливы.)

...