O que é Salt em criptografia
O que é Salt
Um salt é, basicamente, uma cadeia de caracteres aleatória concatenada com uma senha, passphrase ou arquivo antes de efetuar uma operação de hash. O salt pode ser anexado antes ou depois desses dados, e o uso do salt permite que o hash gerado seja completamente diferente toda vez que for gerado, mesmo que a senha seja idêntica.
Assim, por exemplo, se dois usuários escolherem a mesma senha para login em um sistema, o hash de ambas será completamente diferente, por conta do salt adicionado (que será diferente, por ser aleatório).
Chamamos comumente a essa operação de salgar a senha.
O valor de salt gerado é armazenado no banco de dados juntamente com o hash, pois ele será necessário quando do processo de verificação da senha – por exemplo, quando um usuário tenta se logar em um sistema com suas credenciais.
O emprego de salt inutiliza as técnicas empregadas para descobrir senhas hasheadas, como rainbow tables, tabelas de lookup e de lookup reverso, por exemplo. Como o hacker não tem como saber de antemão os valores de salts que serão empregados ao criar os hashes de senha, se torna impossível gerar tabelas de senhas com seus respectivos hashes (como Rainbow Tables).
Além disso,seu uso impede que duas senhas iguais tenham o mesmo valor de hash.
Os salts são gerados usando bibliotecas e funções do tipo CSPRNG (Cryptographically Secure Pseudo-Random Number Generator), ou Gerador de Números Pseudo-Aleatórios Criptograficamente Seguros, que estão disponíveis na maioria das linguagens de programação.
Exemplos dessas bibliotecas e funções em algumas linguagens de programação incluem:
- C – getrandom()
- Java – java.security.SecureRandom
- Python – secrets()
- PHP – password_hash(), random_bytes()
- C# – RNGCryptoServiceProvider
- Ruby – Securerandom
Exemplo
Suponha que um usuário deseja se cadastrar em um sistema online, criando um nome de usuário e uma senha, a saber: usuário fabio e senha a1s2d3fH. Precisamos armazenar esse par de valores em um banco de dados (BD) para permitir que o usuário seja capaz de fazer logon sempre que for necessário em sua conta.
Evidentemente não vamos armazenar essa senha no BD, por questões de segurança – afinal, qualquer um que tenha acesso à tabela do banco de dados poderia obter a senha instantaneamente. O que devemos armazenar é um hash dessa senha – o valor fornecido de senha será processado por um algoritmo de hash criptográfico.
Porém, mesmo essa técnica não é segura, pois é relativamente fácil encontrar tabelas de senhas com seus respectivos hashes pré-calculados na Internet (chamadas de Rainbow Tables) – assim, de posse do hash em si é possível descobrir qual senha foi utilizada para gerá-lo.
Para evitar esse problema usamos o salt.
Geramos um salt criptográfico aleatório (que nunca deve ser reutilizado) e o concatenamos com a senha fornecida pelo usuário, antes de efetuar a operação de hashing. Assim, suponhamos que foi gerado um salt com a sequência de caracteres hfwoffw8k0*4Mj&jk. Esse salt será concatenado com a senha:
hfwoffw8k0*4Mj&jka1s2d3fH
E esse conjunto alimentará a função de hash:
hash = fHash(hfwoffw8k0*4Mj&jka1s2d3fH)
O valor de hash retornado será armazenado no banco de dados. E o salt empregado também deve ser armazenado, para que seja possível validar a senha posteriormente, quando o usuário desejar entrar no dito sistema novamente:
Usuario | HashSenha | Salt |
fabio | fhd#yrfkY6iuhUhygYGytrYT5jh&)dnfnuh&H.U | hfwoffw8k0*4Mj&jk |
Resumindo os passos para armazenar senhas de forma segura com salt
Como armazenar uma senha de forma segura em um banco de dados
- Gere um salt longo e aleatório usando um CSPRNG.
- Anexe o salt gerado à senha escolhida pelo usuário e então crie um hash usando uma função de hash de senha padrão, como bcrypt, scrypt, PBKDF2, ou outra comum.
- Salve tanto o hash gerado quanto o salt em campos no banco de dados.
Como verificar uma senha
- Obtenha o salt e o hash armazenados no banco de dados.
- Anexe o salt à senha fornecida pelo usuário e crie o hash usando a mesma função de hash usada ao armazenar a senha.
- Compare o hash da senha fornecida com o hash armazenado banco de dados. Se eles forem iguais, significa que a senha fornecida está correta. Caso contrário, a senha está errada.
Conclusão
O emprego de salt aumenta brutalmente a segurança ao criptografar dados usando algoritmos de hash, e é imprescindível que o utilizemos em todos os sistemas que exijam autenticação em algum ponto.
Leia mais sobre o utilitário de criptografia bcrypt aqui.
Ótima explicação!
Valeu João!
Gostei muito do artigo, mas tenho uma duvida.
Preciso fazer um login em um sistema.
Tenho o salt e a hash e também tenho a senha. como faço para gerar um hash pra comprar com o do banco de dados?
Não sei qual o algoritmo de foi usado.
Fui contratado recentemente, e a equipe que fez o sistema foi embora, trabalho com C# e o sistema é em php, não consegui achar o algoritmo de usado, por favor me ajude.