2010-06-12 5 views
9

В модуле tornado .web есть функция называется _time_independent_equals:Что означает это `_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 

Он используется для сравнения защищенных подписей печенья, и, таким образом, имя.

Но что касается реализации этой функции, то это просто сложный способ сказать a==b?

ответ

18

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^