hidden: true
Como armazenar senhas
Regra #1: Nunca armazene senhas em plain text. Nunca. Jamais.
O que é hashing?
Hashing transforma a senha em uma string irreversível:
"minhasenha123" → "$2b$12$LJ3m4ys9Rr..."
Não é possível reverter o hash para descobrir a senha original.
Com bcrypt (recomendado)
npm install bcryptjsCriar hash (no cadastro)
import { hash } from "bcryptjs";
const hashedPassword = await hash("senha-do-usuario", 12);
// 12 = salt rounds (mais = mais seguro, mais lento)
await db.user.create({
data: {
email: "[email protected]",
password: hashedPassword,
},
});Verificar (no login)
import { compare } from "bcryptjs";
const user = await db.user.findUnique({ where: { email } });
const isValid = await compare("senha-digitada", user.password);
if (!isValid) {
return Response.json({ error: "Senha incorreta" }, { status: 401 });
}O que NÃO fazer
// ❌ Plain text
await db.user.create({ data: { password: "minhasenha" } });
// ❌ MD5 ou SHA (rápidos demais, fáceis de quebrar)
const hash = crypto.createHash("md5").update(password).digest("hex");
// ❌ Criptografia reversível
const encrypted = encrypt(password); // Se alguém pegar a chave, pega todas as senhasPor que bcrypt?
- É lento de propósito — dificulta ataques de brute force
- Usa salt automático — duas senhas iguais geram hashes diferentes
- É padrão da indústria — testado e confiável
Melhor ainda: não gerencie senhas
Use uma biblioteca de autenticação que faz tudo isso automaticamente:
- Supabase Auth
- Better Auth
- NextAuth
- Clerk
Elas cuidam de hashing, tokens, rate limiting e mais.