Texto de: Letícia Garcez
Introdução
Atualmente, uma das principais preocupações de sites que armazenam dados de usuários é manter a segurança desses dados, já que ataques são cada vez mais frequentes e os bancos de dados de aplicações acabam sendo um dos alvos mais comuns de ataques.
Uma das maneiras utilizadas para mitigar os efeitos de acessos indevidos aos bancos de dados é armazenar dados de maneira que estes não sejam facilmente legíveis, ou seja, caso alguma pessoa mal intencionada consiga acesso ao banco de dados do seu sistema, não conseguirá ler com facilidade as informações armazenadas nele.
Para fazer com que os dados não sejam facilmente legíveis, existem algumas técnicas, como a criptografia de dados, por exemplo. Essa estratégia é muito utilizada no armazenamento de senhas, o qual é o foco desse artigo.
Como criptografar a senha
Existem diversas maneiras de fazer a criptografia de dados, mas considerando o ambiente de desenvolvimento web, falaremos aqui no uso do pacote bcrypt. Este pacote está disponível no npm e para manter a simplicidade, dos exemplos usaremos a versão síncrona das funcionalidades desse pacote ao longo do artigo, embora também possamos utilizar versões assíncronas das mesmas funcionalidades.
Para criptografar a senha, precisamos primeiramente gerar um “sal”. Esse “sal” nada mais é do que um dado gerado de maneira aleatória utilizado no processo de criptografia da senha. Depois disso, basta chamar a função de criptografia (no caso, hashSync
) informando o sal, como no código abaixo:
const bcrypt = require("bcrypt");
const senha1 = "1234567";
const salt = bcrypt.genSaltSync(1);//Geração de um "sal" com custo de processamento 1
const senhaCriptografada = bcrypt.hashSync(senha1,salt);
console.log(senhaCriptografada)
Você verá que o resultado impresso, mesmo para uma senha simples como essa, é uma string complexa, que pode ser armazenada no seu banco de dados, provendo mais segurança para o usuário.
Como saber se o usuário digitou a senha correta
Considerando que a senha do usuário armazenada na máquina é a senha criptografada, como podemos saber se o usuário digitou a senha correta, uma vez que não conseguimos a partir da versão criptografada da senha original retornar à senha original?
Bom, o próprio pacote bcrypt nos oferece funcionalidades capazes de fazer esse tipo de comparação, como no exemplo abaixo.
const bcrypt = require("bcrypt");
const senha1 = "1234567";
const senhaDigitada = "1234567";
const salt = bcrypt.genSaltSync(1);
const senhaCriptografada = bcrypt.hashSync(senha1, salt);
const saoIguais = bcrypt.compareSync(senhaDigitada, senhaCriptografada);
console.log(saoIguais);
Se alterarmos o valor da variável senhaDigitada
, veremos que o resultado impresso na tela mudará uma vez que as senhas sejam diferentes.
Considerações finais
Neste artigo conhecemos o pacote bcrypt e vimos como é possível utilizar esse pacote para fazer a criptografia de uma senha e como podemos verificar posteriormente se a senha digitada pelo usuário corresponde à senha armazenada.