No exactamente SHA1 colisión, pero hay colisiones de PBKDF2-HMAC-SHA1 mensaje de código de autenticación de mensaje.
Por ejemplo, PBKDF2 (SHA1, contraseña, sal, iteraciones, dkLen) de las dos contraseñas plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
y eBkXQTfuBqp\'cTcar&g*
, sal hunter2
, 4
iteraciones, proporcionar el mismo valor (35d1c8f259129dc800ec8e073bb68f995424619c
para dkLen 20
).
De hecho, es trivial encontrar tales colisiones para cadenas de más de 64 bytes.
Otro ejemplo de colisión (python3):
>>> import hashlib, binascii
>>> def pbkdf2sha1hex(x, salt, iters):
... h = hashlib.pbkdf2_hmac('sha1', x, salt, iters)
... return binascii.hexlify(h)
>>> pbkdf2sha1hex(b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
>>> pbkdf2sha1hex(b'\x8c\xbf8\x94\xbc\xf4\xbe\x90xT,r\xbc\x03\xd1\xed\xd9\xea\xfb\x9f', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
Tenga en cuenta que el mismo "problema" se aplica a PBKDF2-HMAC-SHA256 así:
>>> h1 = pbkdf2_hmac('sha256', b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b"\xcf\xc5\xee\x15=\r\x0b\x0e\x89r\x9b\xe1\xb7'+\xa4'o\x98kn++u\x12\xec\xd9\xec\xea\xebL\xb7"
>>> h2 = pbkdf2_hmac('sha256', b'.\x83\xb0D\x93D\x9f\x162\xf3\xd4x\xb6\x1a\x9f-\x1f\xdb\xdc\xa4\x8f\xb3\x95Y5\xea\x99*\x97\x00V\x81', b'NaCl', 1000000)
>>> h1 == h2
True
Todo sucede, porque de la definición PBKDF2, para cadenas largas, contiene:
PBKDF2(hashalgo, s, ...) == PBKDF2(hashalgo, hashalgo(s), ...)
.
Más información, p. aquí: https://mathiasbynens.be/notes/pbkdf2-hmac
La mayoría de las fuentes apuntan a [shattered.io] (https://shattered.io/) - pero ambos dominios muestran el mismo contenido y en realidad resolver al mismo conjunto de direcciones IP, al menos para mí. – Palec