blog
Segurança

Como armazenar senhas corretamente

Se você guarda senhas em plain text, leia isso agora. Guia de hashing com bcrypt.

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 bcryptjs

Criar 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 senhas

Por 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.