In questo esempio, il codice del server è simile al seguente:
Incoming value is "X|Y" -> split between "X" and "Y"
Compute id = Un-Base64(X)
Compute h = SHA-1(secret_key + id)
If the hexadecimal value of h is not equal to Y, then deny access
id is "user|role" with "role" being either 0 or 1; so, if id ends with "|0",
grant administrator access.
secret_key
, ovviamente, è sconosciuto all'attaccante. Ma l'attaccante può tentare di indovinare la lunghezza di quella chiave, se solo provando diverse lunghezze; in questo esempio, secret_key
ha una lunghezza di 25 byte.
SHA-1 soffre del attacco di estensione della lunghezza (come tutti Merkle-Damgård funzioni di hash). Vedi questa risposta per spiegazioni dettagliate; la linea di fondo è che conoscendo la lunghezza di secret_key
, l'attaccante può calcolare una speciale stringa "id" come questa:
id2 = aaaa|1somebytes|0
dove somebytes
include il padding standard SHA-1, e quindi l'attacker può calcolare il valore hash appropriato per quel "id", iniziando con il valore noto SHA-1 (quello per aaaa|1
) e senza conoscere secret_key
(questo è il punto dell '"attacco di estensione della lunghezza": calcolo h (m') dove m ' inizia con uno sconosciuto < em> m , ma con h (m) conosciuto).
Il server crede che la stringa "id" fornita sia autentica e concede i diritti di amministratore a un utente denominato "aaaa | 1somebytes".