Nunca armazene senhas
Parte da seção Autenticação e segurança do Journey de Node.js da Coddy. Lição 1 de 17.
Se seu banco de dados vazar, todas as senhas armazenadas em texto puro poderão ser lidas, e as pessoas usam a mesma senha em outros sites. Por isso, você armazena um hash: um valor calculado a partir da senha que não pode ser convertido de volta nela.
Para senhas, o Node oferece crypto.scrypt. Ele é lento de propósito, então adivinhar milhões de senhas custa horas a um invasor. Um salt, bytes aleatórios misturados antes do cálculo do hash, faz com que duas pessoas com a mesma senha obtenham hashes diferentes. O salt não é secreto: você o armazena junto ao 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 transforma o callback de scrypt em uma promise que você pode usar com await.
Desafio
Fácil- Em
passwords.js, façahashPassword(password)retornarsalt:hash: 16 bytes aleatórios de salt e uma chave scrypt de 64 bytes, ambos em hexadecimal. GET /debug/users/:usernamemostra o que foi armazenado no cadastro.
Pressione Executar. Envie POST /signup com {"username": "ada", "password": "correct horse"}, depois use a mesma senha para bob e compare os dois usuários.
Experimente você mesmo
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Converte uma senha no texto que signup armazena.
// Por enquanto, mantém a senha exatamente como foi digitada.
export async function hashPassword(password) {
return password;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.