En este ejemplo, el código del servidor se ve así:
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
, por supuesto, es desconocido para el atacante. Pero el atacante puede intentar adivinar la longitud de esa clave, aunque solo sea por intentar diferentes longitudes; en ese ejemplo, secret_key
tiene una longitud de 25 bytes.
SHA-1 sufre el ataque de extensión de longitud (como todos Merkle–Damgård funciones hash). Consulte esta respuesta para explicaciones detalladas; La conclusión es que al conocer la longitud de secret_key
, el atacante puede calcular una cadena de "id" especial como esta:
id2 = aaaa|1somebytes|0
donde somebytes
incluye el relleno estándar SHA-1, y luego el atacante puede calcular el valor hash apropiado para ese "id", comenzando con el valor SHA-1 conocido (el de aaaa|1
) y sin saber secret_key
(ese es el punto del "ataque de extensión de longitud": computar h (m ') donde m' comienza con un desconocido < em> m , pero con h (m) conocido).
El servidor considerará que la cadena de "id" proporcionada es genuina y otorgará derechos de administrador a un usuario llamado "aaaa | 1somebytes".