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?

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top