Pregunta

En el tornado .web módulo hay una función llamada _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

Se utiliza para comparar las firmas de galletas seguras, y por lo tanto el nombre.

Sin embargo, en cuanto a la implementación de esta función, se trata sólo de una manera compleja decir a==b?

¿Fue útil?

Solución

Esta función no se limita a comparar las cadenas, se trata de tomar siempre la misma cantidad de tiempo para su ejecución.

Esto es útil para tareas de seguridad como la comparación de las contraseñas. Si la función devuelve el primer byte no coincidente, un atacante podría tratar todos los posibles primeros bytes y saber que el que lleva más tiempo es un partido. Entonces podrían tratar todos los posibles segundos bytes y saber que el que lleva más tiempo es un partido. Esto se puede repetir hasta que se deduce toda la cadena. (En realidad lo que tiene que hacer un montón de promedio para superar los retrasos aleatorios en la red, pero funciona si eres paciente.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top