3
respostas

[Dúvida] Função para validar senha

Foi fornecida função para criar senha criptograda.

import crypto from "crypto";

export const criaSenhaCriptografada = (senha: string) => {
  const salt = crypto.randomBytes(16).toString("hex");
  const hash = crypto.createHmac("sha256", salt);

  hash.update(senha);
  return hash.digest("hex");
};

Como implemento função para validar senha plana com a senha criptografada pela função criaSenhaCriptografada?

3 respostas

Oi,

A função criaSenhaCriptografada que você compartilhou gera um hash da senha, mas não armazena a senha original.

Para validar uma senha plana, você precisa recriar o hash usando o mesmo salt e comparar com o hash armazenado.

O problema é que o salt é gerado aleatoriamente a cada execução da função criaSenhaCriptografada, então não é possível validar a senha diretamente.

Para resolver isso, você precisa armazenar o salt junto com o hash da senha.

Veja um exemplo de como fazer isso:

import crypto from "crypto";

export const criaSenhaCriptografada = (senha: string) => {
  const salt = crypto.randomBytes(16).toString("hex");
  const hash = crypto.createHmac("sha256", salt);
  hash.update(senha);
  const senhaCriptografada = hash.digest("hex");
  return { salt, senhaCriptografada };
};

export const validaSenha = (senhaPlana: string, salt: string, senhaCriptografada: string) => {
    const hash = crypto.createHmac("sha256", salt);
    hash.update(senhaPlana);
    const hashSenhaPlana = hash.digest("hex");
    return hashSenhaPlana === senhaCriptografada;
};

// Exemplo de uso:
const { salt, senhaCriptografada } = criaSenhaCriptografada("minhaSenha123");
console.log("Senha criptografada:", senhaCriptografada);
console.log("Salt:", salt);

const senhaValida = validaSenha("minhaSenha123", salt, senhaCriptografada);
console.log("Senha válida:", senhaValida); // true

const senhaInvalida = validaSenha("senhaErrada", salt, senhaCriptografada);
console.log("Senha válida:", senhaInvalida); // false

Para saber mais: Documentação do módulo crypto do Node.js. Aqui você encontra detalhes sobre as funções de criptografia e hash.

Continue praticando e explorando novas soluções! 💪 🤔

tux matrix Caso este post o tenha ajudado, marque-o como solucionado ☑️. Bons Estudos! 🤓

Ok Luis Dias,

A função criaSenhaCriptografada foi fornecida no curso da Alura.

Quanto a necessidade de retornar {salt, senhaCriptografada } ... foi a mesma conclusão que eu tive. Mas queria confirmar se ainda assim seria possível lidar.

Abraço.

Essa foi a sua pergunta: "Como implemento função para validar senha plana com a senha criptografada"

Então para validar você precisa da senha plana, senha criptografada e o salt usado na criptografia.

Um exemplo de registro com autenticação por login e senha para um sistema com banco de dados

  • Cadastro

    1. O usuário digita um login (nome do usuário) e uma senha.

    2. O sistema gera um salt (um valor aleatório) e usa esse salt para criptografar a senha. return { salt, senhaCriptografada }; // esses dados serão usados para armazenar no banco de dados

    3. O login, salt e a senha criptografada são armazenados no banco de dados.

  • Entrada e validação no Sistema

    1. O usuário digita seu login de usuário e senha.

    2. O sistema recupera o salt e a senha criptografada do banco de dados referente ao login.

    3. Usa o salt e a senha criptografar recuperados do banco de dados com a senha fornecida no login. validaSenha("minhaSenha123", salt, senhaCriptografada);

    4. Se forem iguais, o login é válido. Caso contrário, o login é negado.