La autenticación es el portero a la entrada de tu aplicación. Cada vez que alguien se registra o inicia sesión, tu sistema debe decidir si es quien dice ser. Si te equivocas, no solo estarás depurando un error de inicio de sesión; estarás arriesgándote a que los datos reales de los usuarios salgan directamente por la puerta. Hacer esto correctamente requiere dos herramientas fiables: Bcrypt para proteger las contraseñas en reposo, y JSON Web Tokens para verificar la identidad mientras el usuario navega por tu aplicación.

Por qué falla el almacenamiento en texto plano

Si solo te llevas una regla de este artículo, que sea esta: nunca almacenes contraseñas en texto plano en tu base de datos. No importa si tu base de datos está detrás de un firewall o si confías en cada ingeniero del equipo. Escribir contraseñas en las tablas en su forma bruta es como dejar las llaves de casa bajo el felpudo. En el momento en que alguien obtenga acceso a esa base de datos —ya sea a través de una API mal configurada, una copia de seguridad filtrada o un ataque de inyección—, cada credencial quedará expuesta instantáneamente.

El daño se multiplica porque la gente reutiliza las contraseñas. Una sola brecha puede comprometer no solo tu aplicación, sino también el correo electrónico, las cuentas bancarias y las redes sociales de un usuario. Por eso aplicamos hashing a las contraseñas. El hashing transforma la contraseña en una cadena de caracteres cifrada que no guarda ninguna semejanza obvia con la original. El proceso es unidireccional e irreversible. No puedes verter ácido matemático sobre un hash y disolverlo para recuperar la contraseña que lo creó.

Hashear contraseñas con Bcrypt

Bcrypt es una función de hashing diseñada específicamente para contraseñas. Toma la cadena de texto plano, la procesa a través del cifrado Blowfish y devuelve un resultado similar a $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy. Ese prefijo te indica el algoritmo y el factor de costo. La parte final es una combinación de la sal (salt) y el hash en sí.

La sal es una serie de datos aleatorios que se mezclan con la contraseña antes de que comience el hashing. Debido a que la sal es única para cada usuario, dos personas que elijan "password123" terminarán con hashes completamente diferentes en tu base de datos. Esta diferencia trivial derrota a las tablas arcoíris (rainbow tables) —diccionarios precomputados de hashes para contraseñas comunes— porque los atacantes tendrían que regenerar la tabla completa para cada sal única.

Bcrypt también es deliberadamente lento. El hardware moderno puede adivinar miles de millones de hashes por segundo con algoritmos rápidos como SHA-256. Bcrypt se toma su tiempo. Ejecuta el proceso de hashing múltiples veces, controlado por un factor de costo que puedes aumentar a medida que las computadoras se vuelven más rápidas. Esa lentitud castiga a cualquiera que intente usar fuerza bruta para vulnerar una base de datos robada. Un usuario legítimo que espere doscientos milisegundos extra durante el inicio de sesión no lo notará; un atacante que intente probar millones de combinaciones, ciertamente lo hará.

Cómo funcionan los JSON Web Tokens

Mientras que Bcrypt se encarga de la puerta principal, JWT se encarga del pase por el pasillo. Un JSON Web Token es una cadena compacta y segura para URL que demuestra que un usuario ya ha sido autenticado. Piensa en él como una tarjeta de identificación digital que el servidor emite y el cliente lleva consigo.

Un JWT contiene tres segmentos separados por puntos: el encabezado (header), la carga útil (payload) y la firma (signature). El encabezado especifica el tipo de token y el algoritmo de firma. El payload contiene los claims (afirmaciones sobre el usuario y el propio token), como un ID de usuario, nombre de usuario y una marca de tiempo de expiración. La firma es el sello criptográfico. El servidor la crea codificando el encabezado y el payload, y luego pasándolos a través de una clave secreta. Si alguien manipula el payload, la firma ya no coincidirá y el servidor rechazará el token de inmediato.