Todo desenvolvedor sabe que deixar senhas visíveis em plain text não é uma decisão inteligente, já que qualquer pessoa que tenha acesso a sua base de dados poderia descobrir a senha de todos usuários e usá-las como bem entender. Para resolver esse problema, sempre devemos armazenar as senhas de forma criptografada. Porém, na criptografia simétrica/assimétrica sempre existe uma chave que serve para encriptar, como também descriptografar as informações dos usuários. Portanto, por meio desta chave é possível reverter a encriptação e obter as informações originais.
É para resolver este problema das chaves que são usados os algoritmos de hashing criptográfico, como por exemplo, o crypt. Com estes algoritmos, uma vez que a informação é criptografada, não é mais possível reverter a situação e recuperar os dados. E para poder validar os dados, no caso de login, é só calcular o hash da senha fornecida pelo usuário e comparar com o hash do banco de dados. Bem simples.
Porém, com a constante evolução da tecnologia, é possível criar algoritmos eficientes com o intuito de quebrar hashes por força bruta, e foi por isso que surgiu em 1999, o Bcrypt.
O Bcrypt oferece uma maior segurança do que os outros algoritmos criptográficos porque contém uma variável que é proporcional à quantidade de processamento necessário para criptografar a informação desejada, tornando-o resistente a ataques do tipo “força-bruta”.
Para você ter uma noção de como funciona o bcrypt , temos o Bcrypt generator , que é uma ferramenta online para criação de hashes de acordo com a senha inserida.
Inserindo o bcrypt nos seus projetos node.js
Instalando via npm:
npm install bcrypt --save
Incluindo o módulo no projeto:
var bcrypt = require ('bcrypt')
Criando um “Salt” de 10 caracteres para a senha
var salt = bcrypt.genSaltSync(10)
Aí você deve estar se perguntando: Mas o que é um “Salt”?
Salt é uma sequência de caracteres, números ou termos adicionados antes da senha, que dão aleatoriedade ao resultado da senha criptografada tornando-a mais complexa.
Vamos supor um exemplo prático:
- Senha = 123abc
- Salt = 3540832967
- Senha + Salt = 1233540832967abc
- Senha criptografada = abc7692380453321
Depois disso, use o método hashSync para transformar uma senha de texto simples em um hash criptografado:
var senhaParaSalvar = bcrypt.hashSync(senhaDoUsuario, salt)
Por fim, para comparar uma senha armazenada no banco com a senha inserida pelo usuário (como no caso de login), vamos inserir o seguinte código que faz a pesquisa no banco com a linguagem SQL:
connection.query("SELECT * FROM usuarios WHERE nome = ?", [nomeDigitadoPeloUsuario], function(err, rows) { if (err) { return (err); } if (bcrypt.hashSync(senhaDigitadaPeloUsuario, salt) === rows[0].senha) { //senha correta! } });
Pronto. Agora, mesmo que seu banco de dados seja atacado, as senhas dos usuários estão bem protegidas!