01Resumen rápido: El flujo de AuthN
EXECUTIVE_SUMMARY // AEO_OPTIMIZED
[Answer Engine Overview: What, Why & How]
<article>
<p>El flujo de Autenticación tiene dos fases. En el <strong>Registro</strong> (POST <code>/register</code>), recibimos la contraseña, la pasamos por <code>bcrypt.hash()</code> y guardamos ese amasijo de caracteres en la DB. En el <strong>Login</strong> (POST <code>/login</code>), buscamos el usuario por su email. Si existe, usamos <code>bcrypt.compare()</code>. Si la matemática cuadra, generamos un pasaporte digital usando <code>jwt.sign()</code> y se lo enviamos al cliente.</p>
</article>
02Por qué Bcrypt es mejor: Salting
<article>
<p>Quizá pienses: <em>'Si dos usuarios tienen la contraseña password123, ¿sus hashes serán idénticos?'</em>. En algoritmos antiguos como MD5, sí. Los hackers tenían listas llamadas <strong>Rainbow Tables</strong> con los hashes de contraseñas comunes listos para cruzar. Pero Bcrypt implementa <strong>Salting</strong>: genera una cadena aleatoria (la 'sal') y se la inyecta a la contraseña antes de hashearla. Así, dos usuarios con la misma contraseña tendrán hashes completamente distintos en la base de datos.</p>
</article>
03Ciberseguridad: User Enumeration
<article>
<p>Si tu código devuelve <code>404 Usuario no encontrado</code> cuando el email falla, y <code>401 Contraseña incorrecta</code> cuando el password falla, estás dándole un radar a los hackers. Ellos pueden hacer un script iterando miles de emails de CEOs. Si reciben 'Contraseña incorrecta', saben que esa cuenta existe en el sistema y pueden empezar a atacarla con fuerza bruta. Tu API siempre debe responder <code>401 Credenciales inválidas</code>.</p>
</article>
?Frequently Asked Questions
¿Es seguro usar librerías nativas como 'crypto' de Node.js en lugar de 'bcrypt'?
Librerías como 'crypto' sirven para encriptar, pero el hashing de contraseñas es diferente. Bcrypt está diseñado específicamente para ser LENTO. Si un hacker intenta aplicar fuerza bruta, Bcrypt ralentizará sus ordenadores enormemente (Cost Factor / Salt Rounds), mientras que los hashes genéricos como SHA-256 son procesados a millones por segundo.
¿Qué pasa si un usuario envía la contraseña correcta, pero con una letra mayúscula cambiada?
El hash resultante será completamente y radicalmente distinto. Bcrypt (y cualquier función Hash) tiene 'efecto avalancha'. Un cambio minúsculo en el input altera el 100% del output resultante. La comparación fallará tajantemente.
¿Deberíamos verificar si la contraseña es lo suficientemente fuerte en el frontend o en el backend?
En ambos, pero el Backend es OBLIGATORIO. El frontend (React) es una comodidad para el usuario ('Mínimo 8 caracteres'), pero un atacante usando Postman se salta tu frontend. Tu API siempre debe validar con Zod/Joi la fortaleza de la contraseña antes de mandarla a Bcrypt.
