DevSecOps

19 dez, 2017

Encriptando senhas com o Bcrypt

Publicidade

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!