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 = exigir("bcryptjs"); var sal = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("my-password" (minha senha), sal); |
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" (senha incorreta), hash); bcrypt.compareSync("my-password" (minha senha), 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" (nome): "password-hashing-example" (exemplo de quebra de senha), "versão": "1.0.0", "description" (descrição): "Um exemplo de uso do SDK do Node.js para Couchbase e Bcrypt para fazer hash de senhas", "autor": "Couchbase, Inc.", "licença": "MIT", "dependencies" (dependências): { "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": { "servidor": "127.0.0.1:8091", "bucket" (balde): "restful-sample" (amostra de descanso) } } |
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 = exigir("couchbase"); var bcrypt = exigir("bcryptjs"); var uuid = exigir("uuid"); var configuração = exigir("./config"); var balde = (novo couchbase.Aglomerado(configuração.couchbase.servidor)).openBucket(configuração.couchbase.balde); var jsonData = { id: uuid.v4(), nome de usuário: "nraboy", senha: bcrypt.hashSync("my-password" (minha senha), 10) } balde.inserir("user::" + jsonData.id, jsonData, função(erro, resultado) { balde.obter("user::" + jsonData.id, função(erro, resultado) { console.registro("Correspondência de senha -> " + bcrypt.compareSync("wrong-password" (senha incorreta), resultado.valor.senha)); console.registro("Correspondência de senha -> " + bcrypt.compareSync("my-password" (minha senha), resultado.valor.senha)); }); }); |
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.