💡 Key Takeaways
- What Hash Functions Actually Do (And Why You Should Care)
- MD5: The Broken Hash Function That Won't Die
- SHA-256: The Workhorse of Modern Cryptography
- bcrypt: When Slow Is Actually Good
Eu ainda me lembro do dia em que tive que explicar ao nosso CEO por que nosso banco de dados de usuários estava comprometido. Era 2016, eu era engenheiro de segurança há oito anos e achava que sabia o que estava fazendo. Estávamos usando MD5 para hash de senhas—uma decisão tomada anos antes de eu chegar—e um atacante havia quebrado 87% das 340.000 senhas de usuários em menos de 48 horas. A violação nos custou US$ 2,3 milhões em remediação, incontáveis horas de tempo de engenharia, e quase destruiu nossa reputação. Esse incidente transformou a forma como penso sobre funções hash, e é por isso que estou escrevendo isso hoje.
💡 Principais Conclusões
- O Que As Funções Hash Realmente Fazem (E Por Que Você Deve Se Importar)
- MD5: A Função Hash Quebrada Que Não Morre
- SHA-256: O Cavalo de Trabalho da Criptografia Moderna
- bcrypt: Quando Lento É Realmente Bom
As funções hash são os guardiões invisíveis da segurança de software moderna, e a maioria dos desenvolvedores que mentoro não as compreende realmente. Eles sabem que devem usá-las, mas não entendem por que uma é diferente da outra, ou quando a velocidade se torna uma responsabilidade em vez de um ativo. Este artigo mudará isso. Vou te guiar pelas três funções hash mais importantes que você encontrará—MD5, SHA-256 e bcrypt—explicando não apenas como elas funcionam, mas quando usar cada uma e, mais importantemente, quando evitá-las completamente.
O Que As Funções Hash Realmente Fazem (E Por Que Você Deve Se Importar)
Uma função hash recebe uma entrada de qualquer tamanho e produz uma saída de tamanho fixo chamada hash ou resumo. Pense nisso como um moedor de carne matemático: você pode colocar uma vaca inteira ou um único hambúrguer, mas o que sai sempre tem o mesmo tamanho. A mágica é que esse processo é determinístico— a mesma entrada sempre produz a mesma saída—mas é praticamente impossível reverter.
Aqui está o que torna uma boa função hash criptográfica: Primeiro, ela deve ser determinística. Faça o hash "senha123" um milhão de vezes, e você obterá o mesmo resultado toda vez. Segundo, deve ser rápida de calcular em uma direção, mas computacionalmente inviável de reverter. Terceiro, mesmo uma pequena mudança na entrada deve produzir uma saída completamente diferente—isso é chamado de efeito avalanche. Mude um bit na sua entrada, e aproximadamente 50% dos bits na saída devem mudar.
Quarto, ela deve ser resistente a colisões. Uma colisão ocorre quando duas entradas diferentes produzem a mesma saída de hash. Embora colisões sejam matematicamente inevitáveis (existem entradas infinitas possíveis, mas saídas possíveis finitas), uma boa função hash torna encontrar colisões tão difícil que é praticamente impossível. Finalmente, a saída deve parecer aleatória e uniformemente distribuída, mesmo que seja completamente determinística.
Eu já vi desenvolvedores confundirem funções hash com criptografia, então deixe-me ser muito claro: criptografia é reversível com a chave certa, hashing não é. Quando você criptografa dados, você pretende descriptografá-los mais tarde. Quando você faz hash de dados, você está criando uma impressão digital de mão única. Essa distinção é crucial porque determina qual ferramenta você deve usar para qual trabalho.
No meu trabalho diário de proteção de aplicações financeiras, uso funções hash para três propósitos principais: verificar a integridade dos dados (garantindo que os arquivos não foram adulterados), criar assinaturas digitais e armazenar senhas. Cada caso de uso tem requisitos diferentes, por isso entender as diferenças entre as funções hash é tão importante.
MD5: A Função Hash Quebrada Que Não Morre
MD5 (Mensagem Resumo Algoritmo 5) foi projetado por Ronald Rivest em 1991 e produz um valor de hash de 128 bits (16 bytes), tipicamente representado como uma string hexadecimal de 32 caracteres. Por mais de uma década, foi a função hash preferida para tudo, desde o armazenamento de senhas até a verificação de integridade de arquivos. Hoje, está criptograficamente quebrada, no entanto, ainda a vejo em código de produção pelo menos uma vez por mês.
"A função hash mais rápida é frequentemente a pior escolha para a segurança—velocidade na criptografia é uma vulnerabilidade, não uma característica."
O primeiro ataque sério de colisão contra o MD5 foi publicado em 2004 por Xiaoyun Wang e colegas. Eles demonstraram que encontrar colisões era muito mais fácil do que as teóricas 2^64 operações que deveriam ser necessárias. Em 2008, pesquisadores criaram dois arquivos executáveis completamente diferentes que produziam o mesmo hash MD5. Em 2012, o malware Flame explorou colisões do MD5 para forjar um certificado digital da Microsoft. A mensagem não estava apenas nas paredes—estava pintada com letras neon.
Veja como o MD5 se comporta na prática. A string "Olá, Mundo!" produz o hash MD5: 65a8e27d8879283831b664bd8b7f0ad4. Mude apenas um caractere para "Olá, Mundo?" e você obtém: 7f138a09169b250e9dcb378140907378. Note como a saída é completamente diferente—esse é o efeito avalanche funcionando corretamente. O problema não é que o MD5 falha em atender a esse requisito básico; é que o algoritmo tem fraquezas matemáticas que permitem que atacantes encontrem colisões muito mais rápido do que deveriam.
Então, por que os desenvolvedores ainda usam MD5? Velocidade e familiaridade. O MD5 é incrivelmente rápido—no meu computador de desenvolvimento, consigo calcular cerca de 400 milhões de hashes MD5 por segundo. Também está disponível em praticamente todas as linguagens de programação e frameworks. Já ouvi todas as desculpas: "Estamos apenas usando para checksums, não para segurança," ou "Nosso sistema não é importante o suficiente para ser atacado," ou meu favorito pessoal, "Sempre fizemos assim."
Deixe-me ser direto: existem exatamente dois usos aceitáveis para o MD5 em 2026. Primeiro, você pode usá-lo para propósitos não criptográficos, como criar chaves de cache ou particionar dados, onde a resistência a colisões não importa. Segundo, você pode precisar dele para compatibilidade com sistemas legados que está ativamente trabalhando para substituir. É isso. Se você está usando MD5 para qualquer coisa relacionada à segurança—senhas, assinaturas digitais, verificação de certificados—você está cometendo um erro que eventualmente custará caro.
O argumento de desempenho não se sustenta mais. Alternativas modernas como SHA-256 são rápidas o suficiente para praticamente qualquer caso de uso, e os benefícios de segurança superam em muito a diferença de desempenho negligenciável. Nos sistemas financeiros em que trabalho, processamos milhões de transações diariamente, e a mudança de MD5 para SHA-256 adicionou menos de 2 milissegundos de latência por transação—completamente imperceptível para os usuários, mas dramaticamente mais seguro.
SHA-256: O Cavalo de Trabalho da Criptografia Moderna
SHA-256 (Algoritmo de Hash Seguro 256-bit) faz parte da família SHA-2, projetada pela NSA e publicada em 2001. Produz um valor de hash de 256 bits (32 bytes), tipicamente representado como uma string hexadecimal de 64 caracteres. Diferente do MD5, o SHA-256 não tem ataques de colisão práticos conhecidos, tornando-o o padrão atual para a maioria das aplicações criptográficas.
| Função Hash | Velocidade | Caso de Uso Primário | Status de Segurança |
|---|---|---|---|
| MD5 | Extremamente Rápido (~300 MB/s) | Checksums, integridade de arquivos | Criptograficamente quebrado - Nunca para senhas |
| SHA-256 | Muito Rápido (~150 MB/s) | Assinaturas digitais, certificados, blockchain | Seguro para integridade, rápido demais para senhas |
| bcrypt | Intencionalmente Lento (ajustável) | Hash de senhas | Recomendado para armazenamento de senhas |
| SHA-1 | Muito L... |