criticalCWE-256A02:2021

Contraseñas en Texto Plano

Contraseñas de usuarios guardadas como strings crudos en la base de datos en lugar de hashearse con bcrypt o Argon2.

Cómo Funciona

Si guardas contraseñas tal cual, un solo breach de la base de datos expone la contraseña real de cada usuario. Los atacantes las usan en Gmail, bancos y otros sitios (credential stuffing). El hashing convierte la contraseña en un digest irreversible — aunque el hash se filtre, la contraseña original queda protegida.

Código Vulnerable
// MAL: guardando la contraseña cruda
async function registrar(email: string, password: string) {
  await db.users.create({ data: { email, password } });
}
Código Seguro
// BIEN: hashea antes de guardar
import bcrypt from 'bcrypt';
async function registrar(email: string, password: string) {
  const hash = await bcrypt.hash(password, 12);
  await db.users.create({ data: { email, password: hash } });
}

Ejemplo Real

RockYou (2009), Adobe (2013), LinkedIn (2012) — todos guardaban contraseñas en texto plano o con cifrado reversible. Cada breach comprometió cientos de millones de cuentas en otros servicios mediante credential stuffing.

Cómo Prevenirlo

  • Siempre hashea contraseñas con bcrypt (factor 12+) o Argon2id antes de guardarlas
  • Nunca loguees, imprimas o regreses contraseñas en ninguna parte de tu código
  • Usa un servicio de auth dedicado (Supabase Auth, Auth0, Clerk) que hace esto por ti
  • Agrega un check en CI que detecte campos de contraseña guardados sin hashear

Tecnologías Afectadas

nodejsNext.jsPythonPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas