Los tres se llaman «hash», pero resuelven problemas distintos. MD5 es un hash rápido cuya resistencia a colisiones está rota desde 2004; resérvelo para sumas de comprobación sin adversario. SHA-256 es la opción rápida y segura de uso general para la integridad de archivos, las firmas y HMAC. bcrypt es una función de hash de contraseñas lenta a propósito que añade sal automáticamente; úsela (o Argon2 o scrypt) para contraseñas, y nunca MD5 ni SHA-256 a secas.
De un vistazo
| Propiedad | MD5 | SHA-256 | bcrypt |
|---|---|---|---|
| Diseñado para | Hash general (1992) | Hash general (familia SHA-2, 2001) | Almacenar contraseñas (1999) |
| Salida | 128 bits, 32 caracteres hexadecimales | 256 bits, 64 caracteres hexadecimales | Cadena de 60 caracteres con versión, coste, sal y hash |
| Velocidad | Muy rápido | Rápido | Lento a propósito, ajustable |
| Sal | Ninguna (la añade usted) | Ninguna (la añade usted) | Sal de 128 bits integrada |
| Factor de trabajo | Ninguno | Ninguno | Parámetro de coste: 2^coste rondas |
| Límite de entrada | Prácticamente ninguno | Prácticamente ninguno | Solo se usan los primeros 72 bytes |
| Resistencia a colisiones | Rota: una colisión se obtiene en segundos | Ningún ataque conocido | No es su objetivo |
| Úselo para | Solo sumas de comprobación sin fines de seguridad | Integridad de archivos, firmas, HMAC, identificadores de contenido | Contraseñas |
La misma entrada en cada función:
| Función | Entrada correct horse battery staple |
|---|---|
| MD5 | 9cc2ae8a1ba7a93da39b46fc1019c481 |
| SHA-256 | c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a |
| bcrypt, coste 12 | $2a$12$dPxev78KNUQr7ZVJEsj1QuHnlgkTm.VnudJ/Cny1cr4OIlm0ogWU. |
MD5 y SHA-256 dan siempre la misma salida para la misma entrada. bcrypt da una cadena distinta cada vez porque elige una sal aleatoria nueva; la cadena guarda la versión (2a), el coste (12), la sal de 22 caracteres y el hash de 31 caracteres, es decir, todo lo necesario para verificar la contraseña más tarde. Pruebe los tres con el generador de hash y el generador bcrypt.
MD5
MD5 es rápido y sigue en todas partes, pero en 2004 se publicaron colisiones prácticas (dos entradas distintas con el mismo hash), y después llegaron las colisiones de prefijo elegido, que se usaron para falsificar un certificado de autoridad de certificación en 2008 y para firmar el malware Flame en 2012. Un atacante que pueda influir en la entrada puede hacer que dos archivos compartan hash MD5.
Elija MD5 solo cuando detecte daños accidentales, como una descarga que se corrompió en tránsito, y nadie gane nada falsificando una coincidencia, o cuando un sistema antiguo no publique otra cosa. Incluso entonces, SHA-256 cuesta poco más.
SHA-256
SHA-256 forma parte de la familia SHA-2 normalizada por el NIST. No se conoce ningún ataque práctico de colisión ni de preimagen, y los procesadores modernos tienen instrucciones específicas para calcularlo. En él confían los gestores de paquetes, el nuevo formato de objetos de Git, los certificados TLS, la firma de código y Bitcoin.
Elija SHA-256 cuando necesite una huella de unos datos: verificar una descarga con la calculadora de sumas de comprobación de archivos, almacenamiento direccionado por contenido, firmas digitales o un código de autenticación de mensajes. Para esto último, use HMAC-SHA-256 (pruebe el generador HMAC) en lugar de SHA-256(clave + mensaje), que es vulnerable a ataques de extensión de longitud.
No lo elija para contraseñas. Su rapidez es justo lo que quiere quien intenta descifrarlas.
bcrypt
bcrypt se basa en la costosa preparación de claves del cifrado Blowfish, repetida 2^coste veces. Subir el coste en uno duplica el trabajo: generar un hash en JavaScript tardó unos 55 ms con coste 10, 105 ms con coste 11 y 213 ms con coste 12 en nuestra prueba, y un atacante paga el mismo precio por cada intento. La sal se genera y se guarda automáticamente, así que dos usuarios con la misma contraseña obtienen hashes distintos.
Elija bcrypt cuando almacene contraseñas. Está disponible casi en todas partes, incluidos los archivos de contraseñas de los servidores web (vea el generador de htpasswd). Cuidado con el límite de 72 bytes: las frases de paso más largas se truncan sin aviso. Argon2id, ganador de la Password Hashing Competition, es la opción moderna más robusta donde esté disponible, porque además exige mucha memoria, lo que frena los ataques con GPU.
¿Cuál elegir?
- Guardar contraseñas de usuarios: bcrypt (coste de 10 a 12 o más), o Argon2id o scrypt. Nunca MD5 ni SHA-256 solos, con sal o sin ella.
- Comprobar un archivo o una descarga: SHA-256. MD5 solo si es la única suma publicada.
- Firmar o autenticar mensajes: HMAC-SHA-256 o un esquema de firma de verdad.
- Generar identificadores o claves de caché a partir del contenido: SHA-256 (truncado si necesita algo más corto).
- Cualquier cosa relacionada con la seguridad en código nuevo: MD5 no.
Para saber cómo funcionan por dentro, vea Cómo funciona el hashing.