Aikido

Deje de utilizar MD5 y SHA-1: Hashing moderno para la seguridad

Seguridad

Regla
No utilice anticuado algoritmos hash algoritmos a menos que contextualmente 
Evite utilizar obsoletos hash algoritmos (MD5, SHA-1)
en cualquier sitio contexto de seguridad de seguridad. Estos son criptográficamente
rotos, fácil a fuerza bruta, y dañar sistema la mantenibilidad del sistema.

Idiomas soportados: 45+

Introducción

MD5 y SHA-1 siguen estando muy extendidos en las bases de código de producción a pesar de estar criptográficamente rotos desde hace décadas. MD5 se considera inseguro desde 2004 y SHA-1 desde 2017. Sin embargo, los desarrolladores siguen utilizándolos para hash de contraseñas, firmas digitales y verificación de integridad, donde los ataques de colisión y los ataques de preimagen plantean riesgos de seguridad reales. El coste computacional para generar colisiones MD5 es ahora trivial, y los ataques de colisión SHA-1 son prácticos con recursos de computación en la nube.

Por qué es importante

Implicaciones para la seguridad: MD5 y SHA-1 son vulnerables a ataques de colisión en los que dos entradas diferentes producen el mismo hash de salida. Los atacantes se aprovechan de ello para crear archivos maliciosos con el mismo hash que los legítimos, eludiendo así las comprobaciones de integridad. Para el almacenamiento de contraseñas, estos algoritmos son catastróficamente débiles porque son rápidos, lo que hace triviales los ataques de fuerza bruta y de tabla arco iris. Una GPU moderna puede calcular miles de millones de hashes MD5 por segundo, lo que significa que una contraseña de 8 caracteres puede descifrarse en horas.

Cumplimiento y riesgo legal: Las normas de seguridad como PCI DSS, HIPAA y SOC 2 prohíben explícitamente MD5 y SHA-1 para fines criptográficos. Su uso en entornos regulados genera fallos de auditoría y responsabilidad legal. Los principales navegadores advierten ahora a los usuarios cuando encuentran certificados SHA-1, lo que daña la confianza y puede bloquear el acceso a sus servicios.

Mantenimiento del código: Cuando se descubren algoritmos hash obsoletos en el código, es necesario corregirlos inmediatamente. Esto crea una deuda técnica que se agrava con el tiempo porque la migración se hace más difícil a medida que se acumulan más datos. La adopción temprana de algoritmos seguros evita costosas migraciones futuras y parches de seguridad de emergencia.

Ampliación de la superficie de ataque: Los algoritmos hash débiles crean múltiples vectores de ataque. Las bases de datos de contraseñas se vuelven vulnerables al cracking offline. Las firmas digitales pueden falsificarse. Se pueden eludir los sistemas de integridad de archivos. Cada uso de MD5 o SHA-1 es un incidente de seguridad potencial a punto de producirse.

Ejemplos de códigos

❌ No conforme:

const crypto = require('crypto');

function hashPassword(password) {
  return crypto.createHash('md5')
    .update(password)
    .digest('hex');
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha1')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Por qué es inseguro: MD5 para el hash de contraseñas no ofrece seguridad frente a las herramientas modernas de cracking. SHA-1 para la integridad de archivos puede ser derrotado con ataques de colisión, permitiendo que archivos maliciosos pasen la verificación. Ambos algoritmos son computacionalmente baratos de forzar.

✅ Conforme:

const crypto = require('crypto');

async function hashPassword(password) {
  const salt = crypto.randomBytes(16);
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 310000, 32, 'sha256', (err, key) => {
      if (err) reject(err);
      resolve({ salt: salt.toString('hex'), hash: key.toString('hex') });
    });
  });
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha256')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Por qué es seguro: PBKDF2 con SHA-256 y un elevado número de iteraciones (310.000) hace que el descifrado de contraseñas sea exponencialmente más lento. SHA-256 para la integridad de los archivos es resistente a las colisiones sin ataques prácticos conocidos. Ambos algoritmos cumplen las normas de seguridad y los requisitos de conformidad actuales.

Conclusión

MD5 y SHA-1 no tienen cabida en código sensible a la seguridad. Sus vulnerabilidades están bien documentadas, los exploits son de dominio público y existen alternativas seguras en los principales lenguajes. La ruta de migración está clara: utilice bcrypt, scrypt o Argon2 para las contraseñas y SHA-256 o SHA-3 para la verificación de la integridad. Cada día que estos algoritmos débiles permanecen en producción aumenta su superficie de ataque.

Preguntas frecuentes

¿Tiene alguna pregunta?

¿Cuándo es aceptable utilizar MD5 o SHA-1?

Sólo en contextos no relacionados con la seguridad en los que no se requiera resistencia a las colisiones: claves de caché, ETags para la distribución de contenidos no sensibles o sumas de comprobación para detectar la corrupción accidental de datos (no la manipulación maliciosa). Incluso en estos casos, documente por qué es aceptable el algoritmo más débil. Para cualquier autenticación, autorización, verificación de integridad o firma criptográfica, estos algoritmos nunca son aceptables.

¿Qué debería utilizar en lugar de MD5 y SHA-1 para el hash de contraseñas?

Utiliza bcrypt, scrypt o Argon2. Se trata de funciones de hash de contraseñas especialmente diseñadas que incluyen salting y son intencionadamente lentas para resistir ataques de fuerza bruta. Argon2 es el estándar moderno y ganó la Password Hashing Competition en 2015. Evita usar funciones hash de propósito general como SHA-256 directamente para contraseñas porque son demasiado rápidas. Si tienes que usar SHA-256, envuélvelo en PBKDF2 con al menos 310.000 iteraciones.

¿Y SHA-256 o SHA-3 para la integridad de los archivos?

SHA-256 es actualmente seguro y cuenta con un amplio respaldo. SHA-3 (Keccak) ofrece garantías de seguridad aún mayores con una estructura interna diferente, proporcionando defensa en profundidad si SHA-2 se rompe alguna vez. Para la mayoría de las aplicaciones, SHA-256 es suficiente. Utilice SHA-512 para un margen de seguridad adicional o cuando trabaje con conjuntos de datos muy grandes. Ambos son resistentes a los ataques conocidos de colisión y preimagen.

¿Cómo puedo migrar los hashes MD5/SHA-1 existentes sin romperlo todo?

En el caso de las contraseñas, aplica el doble hash durante la migración: conserva los hashes antiguos temporalmente, pero cuando los usuarios inicien sesión con éxito, vuelve a hash su contraseña con el nuevo algoritmo y actualiza la base de datos. En el caso de tokens de API o hashes de integridad, versione su formato hash (por ejemplo, md5:abc123 frente a sha256:def456) para que los sistemas puedan manejar ambos durante la transición. Fije una fecha límite para la migración y obligue a los usuarios restantes a restablecerse después de esa fecha.

¿Existen diferencias de rendimiento entre estos algoritmos?

Sí, pero no en lo que respecta a la seguridad. MD5 es más rápido que SHA-256, que es exactamente el problema para el hash de contraseñas, donde la lentitud es una característica. Para la integridad de los archivos, la diferencia de rendimiento es insignificante en el hardware moderno. SHA-256 añade microsegundos a operaciones que normalmente implican E/S de disco medidas en milisegundos. El beneficio en seguridad supera con creces cualquier coste de rendimiento.

¿Y HMAC con MD5 o SHA-1?

HMAC-MD5 y HMAC-SHA-1 son más resistentes a los ataques que las funciones hash básicas porque HMAC proporciona propiedades de seguridad adicionales. Sin embargo, siguen estando obsoletas en la mayoría de los estándares de seguridad. Utiliza HMAC-SHA-256 en su lugar. La diferencia de rendimiento es mínima y evitarás problemas de cumplimiento. HMAC-SHA-256 está aprobado para uso federal (FIPS 198-1) y cumple los principales estándares de seguridad.

¿Cómo puedo encontrar todas las instancias de MD5/SHA-1 en mi código base?

Buscar patrones comunes: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Compruebe las configuraciones de dependencia para los ajustes SSL/TLS que utilizan certificados SHA-1. Revise las integraciones API con terceros que puedan requerir estos algoritmos. Las herramientas automatizadas de análisis de código pueden detectar estos patrones en varios lenguajes y marcarlos para su revisión.

Asegúrese gratis

Proteja el código, la nube y el tiempo de ejecución en un sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No requiere tarjeta de crédito | Escanea resultados en 32segs.