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.
Desafío
Fácil- En
passwords.js, haz quehashPassword(password)devuelvasalt:hash: una sal de 16 bytes aleatorios y una clave scrypt de 64 bytes, ambas en hexadecimal. GET /debug/users/:usernamemuestra 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;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.