¿Por qué no simplemente SHA-256?

Un hash criptográfico común como es la herramienta correcta para la integridad, pero la herramienta equivocada para almacenar contraseñas, y la razón es precisamente la propiedad que lo hace bueno en otros sitios: es rápido. Un atacante que roba una base de datos de hashes SHA-256 de contraseñas puede probar miles de millones de intentos por segundo en hardware común, porque cada intento es solo un hash rápido. Las contraseñas comunes caen casi al instante. La velocidad, la virtud de un hash de propósito general, es una desventaja aquí.

El almacenamiento de contraseñas necesita un hash que sea deliberadamente lento y resistente a hardware especializado. Tres bloques de construcción lo hacen funcionar: el salado, un factor de trabajo ajustable y la dureza de memoria.

Salado: derrotar la precomputación

Una sal (salt) es un valor aleatorio único almacenado junto a cada hash de contraseña y mezclado en el proceso de hash. Sin sales, contraseñas idénticas producen hashes idénticos, así que un atacante puede precomputar una tabla gigante de hashes de contraseñas comunes una vez (una "rainbow table") y consultar cada coincidencia al instante. Una sal única por contraseña hace inútil esa precomputación: el atacante debe atacar cada hash individualmente, y la misma contraseña genera un hash distinto para cada usuario. Las funciones modernas de hash de contraseñas generan y almacenan la sal por ti.

Factor de trabajo: hacer cara cada conjetura

Un factor de trabajo (o parámetro de coste) controla cuánta computación requiere cada hash. Ajústalo de modo que un solo hash sea lo bastante lento para ser imperceptible en un inicio de sesión legítimo (unos cientos de milisegundos), pero castigador a escala. Al ser un parámetro, puedes elevarlo con los años a medida que el hardware se acelera, manteniendo el coste de adivinar aproximadamente constante. Este es el dial que un hash de propósito general sencillamente no tiene.

Las tres opciones estándar

  • bcrypt es la opción consolidada y bien comprendida, construida sobre el cifrado Blowfish con un factor de coste configurable. Un valor por defecto seguro donde esté disponible.
  • scrypt añade dureza de memoria: consume deliberadamente una cantidad ajustable de memoria, lo que frena a atacantes que usan GPU y chips personalizados, ya que estos escalan la computación mucho más barato que la memoria.
  • Argon2 ganó la Password Hashing Competition en 2015 y es la recomendación actual para sistemas nuevos. Es de memoria dura, con perillas separadas para memoria, tiempo y paralelismo; la variante Argon2id es la elección habitual.

Cualquiera de estas es una elección razonable; la regla cardinal es usar una de ellas, nunca un hash rápido a secas, y nunca inventar tu propio esquema.

La conclusión

Usa SHA-256 (en la herramienta Hash) para sumas de verificación e integridad, donde la velocidad es una ventaja. Para contraseñas, recurre a bcrypt, scrypt o Argon2, donde la lentitud y el coste de memoria son todo el sentido. Los dos trabajos parecen similares y exigen herramientas opuestas.