Almacenamiento de contraseñas
A02 - Fallas criptográficas. Nunca se guarda la contraseña en texto plano; pero cómo se hashea importa muchísimo.
Hashes guardados de cada usuario
| Usuario | MD5 sin salt (inseguro) | bcrypt con salt (seguro) |
|---|---|---|
| Profe (victima) | 6cae5deced2f4f510040013690d96267 | $2a$10$RQR9kGrw5jX3//fGGqnzGOKwmJrfIpeDp0CteL0fpNy13MUlMY7Z6 |
| Admin | 5f4dcc3b5aa765d61d8327deb882cf99 | $2a$10$afFFWYmqx01IZ8icLGZQeurC4w6Z6UzOza53cSpbdCyhd2EeFgfaW |
| Carla | 5f4dcc3b5aa765d61d8327deb882cf99 | $2a$10$6Ynb0T9KcEanjl1bsO9FkeGtJhYZdnLsx.i4M2Kc0DPX8uqzl7Zw6 |
Fijate que dos usuarios con la misma contraseña tienen el mismo MD5 (se nota el patrón), pero distinto bcrypt gracias al salt aleatorio por usuario.
Diccionario / rainbow table
Precalcular el MD5 de contraseñas comunes y buscar coincidencias es instantáneo:
| Contraseña común | MD5 |
|---|---|
123456 | e10adc3949ba59abbe56e057f20f883e |
password | 5f4dcc3b5aa765d61d8327deb882cf99 |
primavera | 6cae5deced2f4f510040013690d96267 |
admin | 21232f297a57a5a743894a0e4a801fc3 |
qwerty | d8578edf8458ce06fbc5bb76a58c5ca4 |
Por qué bcrypt: es lento a propósito (factor de costo) y usa salt por usuario, lo que vuelve inútiles las rainbow tables y carísimos los ataques de diccionario.