Un ejemplo tangible es el ataque de tiempo en la comparación de cadenas. Funciona midiendo cuánto le toma a la aplicación comparar 2 cadenas.
Las implementaciones de comparación de cadenas predeterminadas en casi todos los lenguajes de programación están optimizadas y funcionan comparando 2 cadenas de caracteres por carácter y alertan de una falta de coincidencia en cuanto ven una diferencia entre los 2 caracteres que se comparan actualmente.
Entonces, si tenemos este código en nuestra aplicación:
def string_compare(a, b) :
if (a == b)
return True
else
return False
1: string_compare('abcdefg', 'abctyf2')
2: string_compare('abcdefg', 'abcdefb')
Lo que sucede es que (1) y (2) van a tomar una cantidad diferente de tiempo para ejecutarse. (1) falla más rápido que (2) así que si cambiamos nuestra entrada (segunda cadena) un carácter a la vez al medir el tiempo que tarda la función en regresar, podemos adivinar la primera cadena.
Para mitigar este ataque de tiempo, tenemos que cambiar nuestro código para que tome una cantidad de tiempo fija, independientemente de cuáles sean las entradas:
def safe_string_compare(a, b) :
if (sha256(a) == sha256(b))
return True
else
return False
OR
def safe_string_compare(a, b) :
if len(a) != len(b):
return False
result = 0
for x, y in zip(a, b) :
result |= x ^ y
return result == 0
Me parece útil esta referencia: reglas de codificación