Estou desenvolvendo um ERP completo para a área de Odontologia, onde posso aprimorar meus conhecimentos e colocá-los em um projeto profissional real. Durante este período, estou utilizando o NestJs para criar os primeiros endpoints, incluindo um para login. Aprendi mais sobre como armazenar senhas em banco de dados e protegê-las usando Hash e Salt.
Em resumo, o hash pode ser considerado como uma função matemática que transforma qualquer arquivo ou conjunto de caracteres em uma sequência única de letras e números. Uma vez que o Hash é gerado, ele nunca mais pode ser alterado. O mesmo segue o padrão de ter o mesmo tamanho (entre 128 e 512 bits) e o mesmo número de caracteres alfanuméricos.
Uma função hash é unidirecional, semelhante a uma função sobrejetiva, onde a imagem é igual ao contradomínio. Um hash pode ser quebrado de várias maneiras por meio de ataques de força bruta ou dicionário.
Mas uma função hash em si é muito mais complexa do que se imagina, pois funciona da seguinte forma: após a criação do Hash, que é uma sequência de bits geradas por algoritmos de informação, várias informações são transformadas em pequenas quantidades de dados. Uma função hash requer considerações adicionais, e a geração de um salt requer considerações adicionais.
O salt é a adição de caracteres, palavras, termos ou mesmo números que introduzem certa aleatoriedade nos algoritmos e tornam-nos mais difíceis de decifrar. Geralmente, são adicionados antes da criptografia e podem ser fixos ou aleatórios. Um exemplo seria o seguinte:
Senha | Hash | Hash + Salt |
---|---|---|
123456 |
213465 |
213465654321A!&** |
senha123 |
1a2b3c |
1a2b3cxyz987$% |
segredo456 |
987zyx |
987zyx!&*abc123 |
minhasenha |
senha123 |
senha123ABCD!@# |
A criação de um salt e a implementação de uma função hash levam muito mais em consideração, mas o objetivo é aumentar a complexidade, especialmente porque bancos de dados de hashes de senhas comuns são amplamente conhecidos e isso compromete a segurança de aplicativos.
Estou utilizando a biblioteca bcrypt no NestJs que tem a função de criar todos os hashs e salts já em funções proprias, o que facilita não só o trabalho de não precisar fazer manualmente, como também garante que a mesma siga todos os padrões de segurança.
Para instalar a lib e utilizar no nestJs:
$ npm i bcrypt
$ npm i -D @types/bcrypt
Seguindo o exemplo da documentação você pode usar a função hash
da seguinte forma:
import * as bcrypt from 'bcrypt';
const saltOrRounds = 10;
const password = 'random_password';
const salt = bcrypt.genSaltSync(saltRounds)
const hash = bcrypt.hashSync(password, salt)
Onde saltOrRounds
define o valor de caracteres
password
é a senha a ser criptografada
com isso passamos saltRound
como parâmetros da função genSaltSync
que é responsável pela criação do salt, a pós isso
passamos na função hashtSync
a senha e o salt criado.
Dando console.log(hash)
já vamos ter a combinação que foi criada.
A documentação da lib se encontra em: https://www.npmjs.com/package/bcrypt para mais funcionalidades.
Feito com ❤️ por Arthur
Artigo bem completinho, muito importante manter a segurança das nossas aplicações.