Por que você deve fazer o Hash
Todas as senhas devem ser transformadas em hash antes de serem inseridas em um banco de dados, pois é preciso considerar o cenário em que algum usuário mal-intencionado tenta obter acesso aos seus dados. As senhas são informações confidenciais que você não quer que as pessoas vejam.
Agora não vamos confundir criptografia com hashing. A criptografia de algo pressupõe que ele possa ser descriptografado posteriormente. Embora isso seja melhor do que deixar como texto simples, o que realmente queremos é algo que não possa ser descriptografado. É isso que o hashing nos oferece.
Hashing com Bcrypt
Para este exemplo, usaremos o mais popular bcryptjs para o Node.js. No entanto, as regras que ela segue são as mesmas que as de outras bibliotecas Bcrypt padrão. Você passa uma string a ser transformada em hash e, normalmente, um salt também.
Para o exemplo de bcryptjs você faria algo assim, de acordo com a documentação:
|
1 2 3 4 5 |
var bcrypt = require("bcryptjs"); var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("my-password", salt); |
O hash produzido a partir disso não seria legível por humanos e, portanto, seguro para ser armazenado em um banco de dados. Mas como comparar as senhas no cenário em que é necessário implementar um login de usuário?
Validação com base em senhas salvas
As bibliotecas Bcrypt sempre têm uma função para comparar uma senha de texto simples com um hash. É assim que você validaria uma senha no cenário de login do usuário.
|
1 2 3 4 |
bcrypt.compareSync("wrong-password", hash); bcrypt.compareSync("my-password", hash); |
As duas linhas acima foram praticamente retiradas da documentação. Na primeira linha, a comparação falhará e retornará false para o usuário. Nesse caso, você sabe que os valores estão errados, mesmo sem saber qual é realmente a senha com hash. No caso da segunda linha, as senhas são iguais e você receberá uma resposta verdadeira.
Um exemplo de trabalho
Vamos criar um exemplo prático com o que aprendemos acima. Crie um novo diretório em algum lugar e, nele, crie um novo package.json com o seguinte JSON:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "name": "password-hashing-example", "version": "1.0.0", "description": "An example of using the Node.js SDK for Couchbase and Bcrypt to hash passwords", "author": "Couchbase, Inc.", "license": "MIT", "dependencies": { "bcryptjs": "^2.3.0", "couchbase": "^2.0.8", "uuid": "^2.0.1" } } |
As partes importantes são as dependências. Estamos incluindo bcryptjs para hashing, couchbase para comunicação com o Couchbase por meio de nosso aplicativo, e uuid para gerar chaves de documento exclusivas.
Agora precisamos criar um novo arquivo chamado config.json em nosso diretório de projeto e inclua o seguinte JSON:
|
1 2 3 4 5 6 7 8 |
{ "couchbase": { "server": "127.0.0.1:8091", "bucket": "restful-sample" } } |
Você deve trocar o servidor e o bucket pelo que planeja usar.
Agora vamos à parte divertida! Crie um arquivo chamado app.js pois é nele que todo o nosso código será inserido. Lembre-se de que este é um exemplo, portanto, a funcionalidade será limitada. Adicione o seguinte código JavaScript à seção app.js file:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var couchbase = require("couchbase"); var bcrypt = require("bcryptjs"); var uuid = require("uuid"); var config = require("./config"); var bucket = (new couchbase.Cluster(config.couchbase.server)).openBucket(config.couchbase.bucket); var jsonData = { id: uuid.v4(), username: "nraboy", password: bcrypt.hashSync("my-password", 10) } bucket.insert("user::" + jsonData.id, jsonData, function(error, result) { bucket.get("user::" + jsonData.id, function(error, result) { console.log("Password Match -> " + bcrypt.compareSync("wrong-password", result.value.password)); console.log("Password Match -> " + bcrypt.compareSync("my-password", result.value.password)); }); }); |
Basicamente, estamos apenas criando um documento JSON com uma senha com hash e inserindo-o no Couchbase Server. Após a conclusão da inserção, obtemos o documento e comparamos as senhas.
Conclusão
Você nunca deve armazenar senhas de texto simples em seu banco de dados. Não importa quão seguro seja o seu banco de dados ou que tipo de banco de dados esteja usando. Ao usar o algoritmo de hashing Bcrypt em suas senhas, você pode adicionar uma enorme quantidade de segurança aos seus usuários.
O bcryptjs para Node.js é apenas uma das muitas bibliotecas adequadas que podem realizar essa tarefa.