Menu
CoddyTech

Nunca almacenes contraseñas

Parte de la sección Autenticación y seguridad del Journey de Node.js de Coddy. Lección 1 de 17.

Si tu base de datos se filtra, se puede leer cada contraseña almacenada tal como se escribió, y la gente usa la misma contraseña en otros sitios. Por eso, guardas un hash: un valor calculado a partir de la contraseña que no se puede convertir de nuevo en ella.

Para las contraseñas, Node ofrece crypto.scrypt. Es lento a propósito, así que adivinar millones de contraseñas le cuesta horas a un atacante. Una sal, bytes aleatorios mezclados antes de calcular el hash, hace que dos personas con la misma contraseña obtengan hashes diferentes. La sal no es secreta: la guardas junto al hash.

import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';

const scryptAsync = promisify(scrypt);

const salt = randomBytes(16).toString('hex');
const key = await scryptAsync('pin 4821', salt, 32);
console.log(key.toString('base64'));

promisify convierte la devolución de llamada de scrypt en una promesa que puedes await.

challenge icon

Desafío

Fácil
  • En passwords.js, haz que hashPassword(password) devuelva salt:hash: una sal de 16 bytes aleatorios y una clave scrypt de 64 bytes, ambas en hexadecimal.
  • GET /debug/users/:username muestra lo que almacenó el registro.

Pulsa Run. Envía POST /signup con {"username": "ada", "password": "correct horse"}, después usa la misma contraseña para bob y, luego, compara ambos usuarios.

Pruébalo tú mismo

import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';

const scryptAsync = promisify(scrypt);

// Convierte una contraseña en el texto que almacena signup.
// Por ahora, conserva la contraseña tal como se escribió.
export async function hashPassword(password) {
    return password;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Autenticación y seguridad