Что означает этот '_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?

9
задан Josh Kelley 12 June 2010 в 03:15
поделиться

1 ответ

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

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

18
ответ дан 4 December 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: