Menu
CoddyTech

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.

challenge icon

Desafio

Fácil
  • Em passwords.js, faça hashPassword(password) retornar salt:hash: 16 bytes aleatórios de salt e uma chave scrypt de 64 bytes, ambos em hexadecimal.
  • GET /debug/users/:username mostra 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;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Autenticação e segurança