Ataque de extensión (relleno) hash

2

Hace poco me encontré con este sitio web hablando del ataque de relleno sha1.

enlace

Después de leer aquí están algunas de mis dudas:

  1. ¿Cómo verifica la firma el lado del servidor? Incluso después de éxito Al rellenar, el hash sha1 sigue siendo diferente de la firma de validación no es así?

Por ejemplo:
secretkey = key1
nombre de usuario = shaun
role = 1
hash sha1: b7de8c16d9f42394b51e0c1c86c36a4b9bca8d49

secretkey = key1
nombre de usuario = shaun
role = 0
hash sha1: 4e86a40776a282816ee0654cb2ec8a3fb2bd25e5

¿Puede alguien explicarme qué parte lo consigo mal? Muchas gracias :)

    
pregunta ysj 27.04.2013 - 16:24
fuente

1 respuesta

4

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".

    
respondido por el Thomas Pornin 27.04.2013 - 18:12
fuente

Lea otras preguntas en las etiquetas