Aikido

Deja de usar 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 siendo muy utilizados en bases de código en producción a pesar de estar criptográficamente comprometidos desde hace décadas. MD5 se considera inseguro desde 2004, SHA-1 desde 2017. Sin embargo, los desarrolladores continúan utilizándolos para el hashing 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 de seguridad: MD5 y SHA-1 son vulnerables a ataques de colisión, donde dos entradas diferentes producen la misma salida hash. Los atacantes explotan esto para crear archivos maliciosos con el mismo hash que los legítimos, eludiendo las comprobaciones de integridad. Para el almacenamiento de contraseñas, estos algoritmos son catastróficamente débiles porque son rápidos, lo que hace que los ataques de fuerza bruta y de tablas arcoíris sean triviales. Una GPU moderna puede calcular miles de millones de hashes MD5 por segundo, lo que significa que una contraseña de 8 caracteres puede ser descifrada en horas.

Riesgo legal y de cumplimiento: Estándares 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 en las auditorías y responsabilidad legal. Los principales navegadores ahora advierten a los usuarios al encontrar certificados SHA-1, lo que daña la confianza y puede bloquear el acceso a sus servicios.

Mantenibilidad del código: Cuando se descubren algoritmos de hashing obsoletos en el código, requieren una remediación inmediata. Esto crea una deuda técnica que se agrava con el tiempo porque la migración se vuelve más difícil a medida que se acumulan más datos. La adopción temprana de algoritmos seguros previene futuras migraciones costosas y parches de seguridad de emergencia.

Expansión de la superficie de ataque: Los algoritmos de hashing 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 ser falsificadas. Los sistemas de integridad de archivos pueden ser eludidos. Cada uso de MD5 o SHA-1 es un incidente de seguridad potencial a la espera de ocurrir.

Ejemplos de código

❌ 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 contra las herramientas de cracking modernas. SHA-1 para la integridad de archivos puede ser superado con ataques de colisión, permitiendo que archivos maliciosos pasen la verificación. Ambos algoritmos son computacionalmente baratos de forzar por fuerza bruta.

✅ 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 alto número de iteraciones (310.000) ralentiza exponencialmente el descifrado de contraseñas. SHA-256 para la integridad de archivos es resistente a colisiones sin ataques prácticos conocidos. Ambos algoritmos cumplen con los estándares de seguridad y requisitos de cumplimiento 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 están disponibles públicamente y existen alternativas seguras en todos los lenguajes principales. La ruta de migración es clara: utilice bcrypt, scrypt o Argon2 para contraseñas, y SHA-256 o SHA-3 para la verificación de integridad. Cada día que estos algoritmos débiles permanecen en producción aumenta su superficie de ataque.

Preguntas frecuentes

¿Tiene preguntas?

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

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

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

Utiliza bcrypt, scrypt o Argon2. Estas son funciones de hash de contraseñas diseñadas específicamente que incluyen salting y son intencionadamente lentas para resistir ataques de fuerza bruta. Argon2 es el estándar moderno y ganó el 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 debes usar SHA-256, envuélvelo en PBKDF2 con al menos 310.000 iteraciones.

¿Qué hay de SHA-256 o SHA-3 para la integridad de archivos?

SHA-256 es actualmente seguro y ampliamente compatible. SHA-3 (Keccak) ofrece garantías de seguridad aún más robustas con una estructura interna diferente, proporcionando una defensa en profundidad en caso de que SHA-2 sea comprometido. Para la mayoría de las aplicaciones, SHA-256 es suficiente. Utilice SHA-512 para un margen de seguridad adicional o al trabajar con conjuntos de datos muy grandes. Ambos son resistentes a ataques de colisión y preimagen conocidos.

¿Cómo migro hashes MD5/SHA-1 existentes sin romperlo todo?

Para las contraseñas, implemente el doble hashing durante la migración: mantenga los hashes antiguos temporalmente, pero cuando los usuarios inicien sesión con éxito, vuelva a aplicar hash a su contraseña con el nuevo algoritmo y actualice la base de datos. Para los tokens de API o hashes de integridad, versione su formato de hash (por ejemplo, md5:abc123 vs sha256:def456) para que los sistemas puedan manejar ambos durante la transición. Establezca una fecha límite de migración y obligue a los usuarios restantes a restablecer su contraseña después de esa fecha.

¿Existen diferencias de rendimiento entre estos algoritmos?

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

¿Qué hay de HMAC con MD5 o SHA-1?

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

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

Busque patrones comunes: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Verifique las configuraciones de dependencias para ajustes SSL/TLS que utilicen certificados SHA-1. Revise las integraciones API con terceros que puedan requerir estos algoritmos. Las herramientas de escaneo de código automatizado pueden detectar estos patrones en múltiples lenguajes y marcarlos para revisión.

Asegúrate ahora.

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

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.