O que isso significa `_time_independent_equals`?
Pergunta
No tornado.Web Módulo Há uma função chamada _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
É usado para comparar assinaturas de cookies seguras e, portanto, o nome.
Mas com relação à implementação desta função, é apenas uma maneira complexa de dizer a==b
?
Solução
Essa função não compara simplesmente as seqüências, ela tenta sempre levar a mesma quantidade de tempo para executar.
Isso é útil para tarefas de segurança como comparar senhas. Se a função retornar no primeiro byte incompatível, um invasor poderá tentar todos os primeiros bytes possíveis e saber que aquele que demora mais é uma correspondência. Em seguida, eles poderiam tentar todos os segundos possíveis e sabem que o que demora mais é uma correspondência. Isso pode ser repetido até que toda a string seja deduzida. (Na realidade, você precisa fazer muita média para superar atrasos aleatórios na rede, mas funciona se você for paciente.)