Un esempio tangibile è l'attacco a tempo sul confronto tra stringhe. Funziona misurando quanto ci vuole per l'applicazione per confrontare 2 stringhe.
Le implementazioni di confronto delle stringhe predefinite in quasi tutti i linguaggi di programmazione sono ottimizzate e funzionano confrontando 2 stringhe carattere per carattere e avvisano una mancata corrispondenza non appena vedono una differenza tra i 2 caratteri attualmente confrontati.
Quindi, se abbiamo questo codice nella nostra applicazione:
def string_compare(a, b) :
if (a == b)
return True
else
return False
1: string_compare('abcdefg', 'abctyf2')
2: string_compare('abcdefg', 'abcdefb')
Quello che succede è che (1) e (2) hanno bisogno di tempo diverso per essere eseguiti. (1) fallisce più velocemente di (2) quindi se cambiamo il nostro input (seconda stringa) un carattere alla volta misurando il tempo necessario per il ritorno della funzione, possiamo indovinare la prima stringa.
Per mitigare questo attacco di temporizzazione, dobbiamo cambiare il nostro codice in modo che impieghi una quantità di tempo fissa indipendentemente da quali siano gli input:
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
Trovo utile questo riferimento: regole di codifica