Вопрос

в торнадо.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?

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top