Cuando se comprueban las cadenas en busca de igualdad, debes verificar que todos los caracteres coincidan. La mayoría de los lenguajes de programación tomarán un atajo y devolverán Falso, o No igual, tan pronto como encuentren un solo carácter que no coincida. Por ejemplo,
str1 = "1111111111111111"
str2 = "1101111111111111"
Sabes que no son iguales en cuanto alcanzas ese 0, ¿por qué seguirías comprobando?
Esto es super explotable. Imagina que estoy intentando descifrar una contraseña (o un hash, o una etiqueta MAC, o cualquier cosa que deba ser comparada por su igualdad), sabiendo que el servidor hará una comparación de cadena perezosa en algún lugar, podría obtener la siguiente sincronización resultados (completamente confeccionados):
Tried "aaaaaaaa", it took 0.2 ms
Tried "bbbbbbbb", it took 0.2 ms
Tried "cccccccc", it took 0.4 ms
Genial, ahora sé que la primera letra es 'c' porque tomó más tiempo. Ahora puedo hacer el mismo truco con "caaaaaaa", "cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.
Esta comparación de cadenas "perezosa" es generalmente algo bueno para los programadores porque hace que las cosas se ejecuten más rápido, pero es malo para la seguridad. Las comparaciones de cadenas seguras se verán hasta el final, incluso si se encuentra una diferencia para que nunca haya una diferencia de tiempo.