Hash e Salt: Como Sistemas Seguros Guardam a Sua Senha

Entenda o que é hash, por que senhas não devem ser criptografadas nem salvas em texto puro e como o salt protege contra ataques de dicionário.

Compartilhar no Linkedin Compartilhar no WhatsApp

Tempo estimado de leitura: 9 minutos

Imagem do artigo Hash e Salt: Como Sistemas Seguros Guardam a Sua Senha

Quando você cria uma conta em um site e escolhe uma senha, onde ela vai parar? Muita gente imagina que a senha fica guardada em um banco de dados exatamente como foi digitada. Em sistemas bem construídos, isso não acontece. O que fica armazenado é um hash da senha, normalmente combinado com um salt. Esses dois conceitos são fundamentais em segurança da informação e ajudam a entender por que vazamentos de dados podem ser mais ou menos graves.

Neste artigo, você vai aprender, sem matemática complicada, o que é uma função hash, por que ela é usada para senhas, o que é salt e quais algoritmos são recomendados hoje.

O problema de guardar senhas em texto puro

Se um sistema salva as senhas exatamente como os usuários digitaram (o chamado texto puro), basta um único vazamento do banco de dados para que todas as senhas fiquem expostas. E como muitas pessoas repetem a mesma senha em vários serviços, o estrago vai muito além daquele site: o invasor pode testar as mesmas combinações de e-mail e senha em redes sociais, bancos e lojas virtuais.

Além disso, guardar senhas legíveis significa que qualquer pessoa com acesso interno ao banco de dados, como um funcionário mal-intencionado, consegue vê-las. Por isso, a regra básica é: o sistema não precisa saber qual é a sua senha, só precisa conseguir verificar se você digitou a senha certa.

O que é uma função hash

Uma função hash criptográfica é um algoritmo que recebe uma entrada de qualquer tamanho (uma palavra, um texto ou um arquivo) e produz uma saída de tamanho fixo, uma espécie de “impressão digital” daquele dado. Ela tem algumas propriedades importantes:

  • Determinística: a mesma entrada sempre gera o mesmo hash.
  • Unidirecional: a partir do hash, não é viável descobrir a entrada original. Não existe um “desfazer”.
  • Efeito avalanche: uma mudança mínima na entrada, como trocar uma letra minúscula por maiúscula, gera um hash completamente diferente.
  • Resistência a colisões: deve ser extremamente difícil encontrar duas entradas diferentes que produzam o mesmo hash.

Como o login funciona com hash

  1. No cadastro, você digita sua senha.
  2. O sistema calcula o hash dessa senha e salva apenas o hash no banco de dados.
  3. No login, você digita a senha novamente.
  4. O sistema calcula o hash do que você digitou e compara com o hash armazenado.
  5. Se os dois forem iguais, a senha está correta e o acesso é liberado.

Repare que, em nenhum momento, o sistema precisa guardar a senha original. É por isso que serviços bem projetados não conseguem “te enviar a sua senha” quando você a esquece: eles não a conhecem. O que oferecem é um link para criar uma senha nova.

Hash não é criptografia

É comum ouvir que as senhas são “criptografadas”, mas há uma diferença importante entre os dois conceitos:

CaracterísticaCriptografiaHash
É reversível?Sim, com a chave corretaNão
Usa chave?SimNão (a função é pública)
Tamanho da saídaVaria conforme a entradaFixo
Uso típicoProteger dados que precisam ser lidos depois (mensagens, arquivos)Verificar integridade e armazenar senhas

Se as senhas fossem apenas criptografadas, quem obtivesse a chave conseguiria recuperar todas elas. Com hash, não há chave a ser roubada.

O ponto fraco do hash simples

Se o hash é irreversível, por que ainda existem senhas descobertas após vazamentos? Porque, embora não seja possível “desfazer” o hash, é possível adivinhar. O atacante pega uma lista enorme de senhas comuns (como “123456”, “senha123” ou nomes seguidos de datas), calcula o hash de cada uma e compara com os hashes vazados. Esse é o ataque de dicionário.

Há ainda uma versão mais eficiente: as tabelas pré-computadas (como as chamadas rainbow tables), em que os hashes de milhões de senhas já foram calculados antecipadamente. E existe outro problema: se dois usuários têm a mesma senha, eles terão o mesmo hash. Assim, quebrar uma senha revela automaticamente todas as contas que a utilizam.

O que é salt e como ele resolve isso

O salt (“sal”, em inglês) é um valor aleatório, diferente para cada usuário, que é combinado com a senha antes de calcular o hash. O salt é armazenado junto com o hash; ele não é secreto. Seu papel é tornar cada hash único.

  • Dois usuários com a mesma senha passam a ter hashes diferentes, porque seus salts são diferentes.
  • Tabelas pré-computadas deixam de ser úteis, pois o atacante precisaria gerar uma tabela para cada salt.
  • O atacante é obrigado a testar as tentativas de senha conta por conta, o que aumenta muito o custo do ataque.

Algumas aplicações também usam um pepper: um valor secreto adicional, igual para todos os usuários, guardado fora do banco de dados. Ele acrescenta uma camada extra, mas não substitui o salt.

Algoritmos rápidos e algoritmos lentos

Aqui está um detalhe que surpreende muita gente: para senhas, um algoritmo de hash rápido é ruim. Funções como MD5 e SHA-256 foram feitas para serem velozes, o que é ótimo para verificar arquivos, mas também permite que um atacante teste bilhões de tentativas com hardware adequado. O MD5 e o SHA-1, além disso, já são considerados inseguros para fins criptográficos.

Para senhas, recomenda-se usar funções criadas especificamente para esse fim, que são propositalmente lentas e permitem ajustar o custo computacional:

  • Argon2: vencedor da Password Hashing Competition, em 2015; é configurável em tempo e uso de memória.
  • bcrypt: amplamente usado há muitos anos e disponível na maioria das linguagens.
  • scrypt: exige bastante memória, o que dificulta ataques com hardware especializado.
  • PBKDF2: aplica o hash milhares de vezes seguidas; é comum em sistemas que seguem normas específicas.

Essas funções já incorporam o salt automaticamente, o que reduz a chance de erro do desenvolvedor. Uma regra de ouro da área é nunca criar o próprio algoritmo de segurança: use bibliotecas consolidadas e mantidas pela comunidade.

O que isso significa para você, usuário

Mesmo com hash e salt, senhas fracas continuam vulneráveis, porque estão no topo das listas usadas nos ataques de dicionário. Algumas atitudes fazem diferença:

  • Use senhas longas, como frases com várias palavras.
  • Não repita a mesma senha em serviços diferentes.
  • Use um gerenciador de senhas para não precisar memorizar tudo.
  • Ative a autenticação em dois fatores sempre que estiver disponível.
  • Desconfie de serviços que conseguem enviar sua senha original por e-mail: isso indica que ela não está protegida com hash.

Conclusão

Hash e salt formam a base do armazenamento seguro de senhas. O hash garante que a senha original não fique guardada; o salt impede que senhas iguais tenham hashes iguais e inutiliza tabelas pré-calculadas; e algoritmos lentos, como Argon2 e bcrypt, tornam as tentativas de adivinhação caras demais. Entender esses conceitos é essencial tanto para quem desenvolve sistemas quanto para quem quer se proteger melhor na internet.

Se você quer ir além e aprender sobre criptografia, autenticação, ataques comuns e boas práticas de defesa, confira os cursos gratuitos de Segurança da Informação disponíveis na Cursa.

Cookies, Cache e Histórico: O Que o Navegador Guarda Sobre Você

Entenda o que são cookies, cache e histórico do navegador, para que servem, quando limpar cada um e como isso afeta sua privacidade.

Sensores e Atuadores: Como o Arduino Percebe o Mundo e Age Sobre Ele

Entenda a diferença entre sensores e atuadores, como o Arduino lê sinais e aciona dispositivos, e como montar seus primeiros projetos.

Endereço IP, Máscara de Sub-rede e Gateway: O Trio Que Faz Sua Rede Funcionar

Entenda de forma prática o que são endereço IP, máscara de sub-rede e gateway padrão, e como esses três parâmetros conversam entre si.

Compressão de Arquivos: Como o ZIP Consegue Reduzir o Tamanho dos Seus Dados

Entenda como funciona a compressão de arquivos, a diferença entre métodos com e sem perda e quando cada formato faz sentido.

Expressões Regulares (Regex): O Que São e Como Usar na Prática

Aprenda o que são expressões regulares, os principais símbolos, quantificadores e como aplicar regex para buscar e validar textos.

Como Funciona o DNS: o Sistema que Traduz Nomes em Endereços na Internet

Entenda de forma simples o que é DNS, como acontece a resolução de nomes, os principais tipos de registro e por que ele é essencial para a internet.

INNER JOIN, LEFT JOIN e RIGHT JOIN: como relacionar tabelas no SQL

Entenda de forma simples como funcionam INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN para combinar dados de várias tabelas no SQL.

TypeScript para iniciantes: o que é e por que ele melhora o JavaScript

Entenda o que é TypeScript, como a tipagem estática ajuda a evitar erros e por que ele se tornou essencial no desenvolvimento web moderno.