Como gerar hashes MD5, SHA-256 e outros
O hashing converte qualquer entrada (uma palavra-passe, um ficheiro, uma mensagem) numa string de caracteres de comprimento fixo. A mesma entrada produz sempre o mesmo hash, mas mesmo uma alteração minúscula na entrada produz um hash completamente diferente. Isto torna o hashing essencial para verificação de integridade, armazenamento de palavras-passe, assinaturas digitais, provas blockchain e dezenas de outros blocos de construção da computação moderna. Escolher o algoritmo certo, saber porque alguns estão partidos e reconhecer os padrões que usam mal os hashes transforma uma ferramenta de cinco segundos numa base sobre a qual pode construir com segurança.
Uma breve história das funções de hash
O hashing como ideia de programação antecede a criptografia em décadas, as tabelas de hash em estruturas de dados usam funções simples como CRC e FNV para distribuir chaves por buckets. Os hashes criptográficos, desenhados para serem irreversíveis e resistentes a colisões, emergiram no final dos anos 80 com o MD4 (1990) e o MD5 (1991) de Ron Rivest. O MD5 tornou-se o padrão de facto durante duas décadas, antes de colisões práticas o tornarem inseguro para trabalho de segurança.
O SHA-0 (1993) do NIST foi retirado quase imediatamente e substituído por SHA-1 (1995). O SHA-1 aguentou melhor mas caiu por etapas: ataques teóricos em 2005, um cenário prático de falsificação de certificado por 2009, e a demonstração SHAttered da Google em 2017, dois PDF diferentes com o mesmo hash SHA-1. A família SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512), publicada em 2001, foi desenhada como substituta a longo prazo e continua segura hoje. O SHA-3 (Keccak, padronizado em 2015) é um desenho estruturalmente diferente, pensado para servir de alternativa se o SHA-2 alguma vez cair.
Em paralelo, os hashes específicos para palavras-passe evoluíram em separado. O MD5 ou SHA-1 puros revelaram-se demasiado rápidos para armazenamento de palavras-passe, por isso o bcrypt (1999), o scrypt (2009) e o Argon2 (2015, vencedor da Password Hashing Competition) acrescentaram lentidão deliberada e dureza de memória, tornando os ataques de força bruta ordens de grandeza mais caros. O hash certo para uma palavra-passe nunca é o mesmo que o hash certo para uma checksum de ficheiro.
Como funciona o hashing
Uma função de hash recebe uma entrada de qualquer tamanho e produz uma saída de tamanho fixo:
| Entrada | Hash SHA-256 (primeiros 16 car.) |
|---|---|
| hello | 2cf24dba5fb0a30e... |
| Hello | 185f8db32271fe25... |
| hello! | ce06092fb948d9ff... |
Note que alterar um único caractere (h minúsculo para H maiúsculo) ou acrescentar um caractere altera completamente o hash. A isto chama-se o efeito avalanche e é o que torna os hashes úteis para detetar qualquer alteração, por mais minúscula que seja.
Internamente, uma função de hash moderna divide a sua entrada em blocos de tamanho fixo (64 bytes para SHA-256, 128 para SHA-512), passa cada bloco por uma função de compressão e encadeia o estado para a frente. A saída é o estado final depois de o último bloco ter sido misturado. Como a cadeia depende de cada byte, não há atalho que permita a um atacante alterar a entrada sem reescrever o hash todo.
Um bom hash criptográfico tem três propriedades de segurança: resistência à pré-imagem (não consegue encontrar uma entrada que produza um determinado hash), resistência à segunda pré-imagem (dada uma entrada, não consegue encontrar outra diferente com o mesmo hash) e resistência a colisões (não consegue encontrar duas entradas distintas com o mesmo hash). O MD5 falha as três; o SHA-1 falha a resistência a colisões; o SHA-2 e o SHA-3 ainda mantêm as três.
Algoritmos de hash comuns
| Algoritmo | Bits de saída | Comprimento | Estado | Usar para |
|---|---|---|---|---|
| MD5 | 128 | 32 hex | Partido (inseguro) | Checksums legadas, usos sem segurança |
| SHA-1 | 160 | 40 hex | Partido (inseguro) | Apenas sistemas legados |
| SHA-224 | 224 | 56 hex | Seguro (de nicho) | Preferir SHA-256 |
| SHA-256 | 256 | 64 hex | Seguro | Integridade de ficheiro, assinaturas digitais |
| SHA-384 | 384 | 96 hex | Seguro | Suites de cifra TLS 1.3 |
| SHA-512 | 512 | 128 hex | Seguro | Apps de alta segurança, desempenho 64 bits |
| SHA3-256 | 256 | 64 hex | Seguro | Alternativa à prova de futuro do SHA-256 |
| BLAKE2b / BLAKE3 | 256 ou 512 | variável | Seguro, muito rápido | rsync, restic, hashing em massa |
| HMAC-SHA256 | 256 | 64 hex | Seguro | Assinatura de pedidos API |
| bcrypt | 184 | 60 car. (personalizados) | Seguro para palavras-passe | Armazenamento de palavras-passe |
| Argon2id | configurável | variável | O melhor para palavras-passe | Armazenamento moderno de palavras-passe |
| CRC32 | 32 | 8 hex | Apenas deteção de erro | Não é um hash de segurança |
SHA-256 é o padrão atual para a maioria dos usos gerais. O MD5 e o SHA-1 só devem ser usados ao interagir com sistemas legados que os exijam; nunca para fronteiras de segurança. Para palavras-passe, use bcrypt ou Argon2id, não SHA-256 puro.
Como gerar um hash
- Escolha o seu algoritmo: selecione MD5, SHA-1, SHA-256, SHA-384 ou SHA-512 no dropdown. Use SHA-256 a não ser que tenha razão específica para escolher outro.
- Introduza texto ou carregue um ficheiro: escreva ou cole texto na caixa de entrada, ou largue um ficheiro. A ferramenta executa o hash inteiramente no seu browser usando a API Web Crypto.
- Copie o hash: o resultado é uma string hex que pode usar para verificação, armazenamento ou comparação. Muitas ferramentas oferecem também codificação base64 para armazenamento compacto.
- Compare se necessário: cole o hash publicado ao lado do seu hash gerado e deixe a ferramenta assinalar o primeiro caractere que diverge. Comparar strings de 64 caracteres visualmente está sujeito a erros.
Usos práticos
Verificação de integridade de ficheiro: descarregue um ficheiro e compare o seu hash com o hash oficial do editor. Se coincidirem, o ficheiro é autêntico e não está corrompido. Este é o caso de uso que motiva a maioria das gerações diárias de hash, o fluxo por detrás de cada invocação de sha256sum em Linux e de cada página de checksums num download de software.
Armazenamento de palavras-passe, as aplicações armazenam hashes de palavras-passe, não as palavras-passe em si. Quando faz login, a sua entrada é hashada e comparada com o hash armazenado. O detalhe crucial é que o algoritmo tem de ser lento de propósito (bcrypt, Argon2) para que um atacante que roube o ficheiro de hashes não consiga forçá-lo em tempo razoável.
Deduplicação de dados: sistemas de armazenamento e ferramentas de backup fazem hash a pedaços de dados, muitas vezes blocos de alguns megabytes, e usam o hash como chave. Dois pedaços com o mesmo hash assumem-se idênticos, portanto a segunda ocorrência guarda apenas um apontador. Ferramentas como restic, borg e muitos serviços de backup na cloud dependem disto.
Assinaturas digitais: uma assinatura digital é um hash cifrado com uma chave privada. O verificador faz hash ao documento, decifra a assinatura com a chave pública e confirma que ambos coincidem. Isto prova tanto que o documento não mudou como que o signatário aprovou esta versão exata.
HMAC para segurança de API: HMAC combina uma função de hash com uma chave secreta, produzindo uma etiqueta que qualquer pessoa com a mesma chave consegue verificar. Webhooks, assinatura de pedidos AWS e muitas RPC internas usam HMAC-SHA256 para que o recetor saiba que o pedido veio realmente de uma fonte confiável.
Blockchain e árvores Merkle: criptomoedas, armazenamento endereçável por conteúdo (IPFS) e Git usam todos árvores de hash para se comprometerem com grandes conjuntos de dados através de um único hash raiz. Mude um byte em qualquer ponto da árvore e o hash raiz muda, é essa a propriedade que torna os dados à prova de adulteração.
Chaves de cache: sistemas de cache fazem hash a URLs de pedido ou parâmetros para produzir uma chave de lookup compacta. CRC e SipHash são comuns aqui porque priorizam velocidade sobre garantias criptográficas.
Hash vs HMAC vs assinatura digital
Estes três conceitos são frequentemente confundidos por produzirem todos strings hex com aspeto semelhante.
| Conceito | Entradas | Verifica | Uso comum |
|---|---|---|---|
| Hash | Dados | Os dados não mudaram desde que o hash foi calculado | Checksums, endereçamento por conteúdo |
| HMAC | Dados + segredo partilhado | Dados inalterados E criados por alguém com o segredo | Assinatura de pedidos API, webhooks |
| Assinatura digital | Dados + chave privada | Dados inalterados E assinados por uma chave específica | Certificados TLS, assinatura de software |
| Cifragem | Dados + chave (qualquer) | Os dados foram mantidos secretos em trânsito | Confidencialidade (não integridade só) |
Um hash puro não prova nada sobre quem o criou. HMAC prova que o emissor tinha o segredo partilhado. Uma assinatura identifica adicionalmente o signatário sem precisar de partilhar o segredo. Escolha a ferramenta mais fraca que resolve o seu problema real.
Armadilhas comuns
- Usar MD5 ou SHA-1 para segurança, ambos estão criptograficamente partidos. Podem gerar-se colisões em segundos (MD5) ou horas em hardware cloud (SHA-1). Reserve-os estritamente para checksums sem segurança.
- Fazer hash de palavras-passe com hashes de uso geral, SHA-256 puro de uma palavra-passe é rápido o suficiente para que um atacante com uma base roubada consiga tentar milhares de milhões de palpites por segundo numa GPU. Use bcrypt, scrypt ou Argon2id em vez disso.
- Esquecer de salgar, dois utilizadores com a mesma palavra-passe nunca deveriam produzir o mesmo hash armazenado. Salgar (adicionar bytes aleatórios a cada palavra-passe antes do hash) previne isto e impede pesquisas em rainbow tables.
- Confiar num hash servido do mesmo sítio que o ficheiro, um atacante que comprometa um mirror de download pode trocar tanto o ficheiro como o seu hash. Sempre que possível, obtenha o hash de um domínio diferente ou verifique uma assinatura GPG sobre a lista de hashes.
- Confusão hex vs base64, o mesmo hash codifica para 64 caracteres hex ou 44 base64. Comparar codificações diferentes falha sempre. Equipare a codificação antes de comparar.
- Comparar com
==em código de segurança, a comparação de strings faz curto-circuito no primeiro caractere divergente, o que vaza informação de tempo. Use uma função de comparação de tempo constante em qualquer código que decida autenticação. - Truncar um hash para poupar espaço, tirar só os primeiros 8 caracteres de SHA-256 corta a resistência a colisões de astronómica a trivial. Ou guarde o hash completo ou use um hash desenhado para saídas curtas (SipHash).
- Usar um CRC para segurança, CRC32 é ótimo a apanhar corrupção acidental, mas trivial de forjar. Qualquer pessoa pode acrescentar bytes para fazer com que um CRC produza qualquer valor escolhido.
- Re-fazer hash em vez de usar um PBKDF, pôr SHA-256 num ciclo de dez mil iterações à mão é o hash de palavra-passe caseiro clássico; vaza tempo e é muito mais lento que as implementações bem auditadas de PBKDF2/bcrypt/Argon2.
- Guardar o hash ao lado do sal com o mesmo hash em cada login, um atacante que lê o hash e o sal só tem de partir uma palavra-passe de cada vez, mas se reutilizar um único sal global para todos os utilizadores, uma única rainbow table parte-as todas. Cada utilizador recebe um sal aleatório novo.
Ferramentas e bibliotecas alternativas
O gerador de hash no browser é o caminho mais rápido para hashes pontuais. Para uso repetido ou scripts, as ferramentas de linha de comandos e bibliotecas de linguagem tomam conta.
| Ferramenta | Plataforma | Força | A vigiar |
|---|---|---|---|
| Gerador de hash web | Browser | Instantâneo, sem instalação, sem upload | Uma entrada de cada vez |
sha256sum, md5sum | Linux | Scriptável, GNU coreutils | --check lê ficheiros SHA256SUMS |
shasum -a 256 | macOS, BSD | Incluído no SO | Nome de binário diferente do Linux |
Get-FileHash | Windows PowerShell | De primeira classe no Windows | Formato de saída difere de sha256sum |
openssl dgst -sha256 | Multiplataforma | Se já tiver OpenSSL | Mais lento que ferramentas dedicadas |
b3sum / BLAKE3 CLI | Multiplataforma | Débito multi-GB/s | Mais recente, menos ubíquo |
Python hashlib | Python | Incorporado, todos os algoritmos principais | Mantenha-se em entrada em bytes |
Node crypto | Node.js | Incorporado, API semelhante à do Python | Streaming para ficheiros grandes |
Web Crypto subtle.digest | JS no browser | Nativo, rápido, sem dependências | Só API assíncrona |
| HashiCorp Vault / KMS | Cloud | Gestão centralizada de chaves para HMAC e assinatura | Lock-in do fornecedor |
Para palavras-passe, trate o ecossistema da linguagem de forma diferente: use bcrypt, argon2-cffi, passlib, ou o adaptador recomendado pela sua plataforma, nunca um ciclo SHA artesanal.
Privacidade e o gerador de hash
O gerador de hash corre inteiramente no seu browser. O texto que digita é hashado em memória com a interface SubtleCrypto da Web Crypto, e qualquer ficheiro que selecione é transmitido pela API FileReader sem upload. Não há registo das entradas hashadas, nem analítica sobre que algoritmos são populares, nem maneira de alguém reconstruir o que estava a verificar. Os hashes em si resumem frequentemente material sensível, palavras-passe, documentos internos, chaves privadas, exatamente o tipo de dados que nunca deve colar num formulário web estranho. Fazer o trabalho do lado do cliente mantém a entrada na sua máquina, onde pertence. Para uma tarefa tão rotineira como gerar uma checksum, o nível de privacidade por defeito deve ser: nada sai da página, nada é armazenado, nada é partilhado.
Perguntas frequentes
Qual a diferença entre MD5, SHA-1 e SHA-256?
MD5 produz um hash de 128 bits (32 caracteres hex), SHA-1 produz 160 bits (40 caracteres) e SHA-256 produz 256 bits (64 caracteres). MD5 e SHA-1 são considerados criptograficamente quebrados para fins de segurança. SHA-256 é atualmente seguro e recomendado para verificação de integridade e aplicações de segurança.
É possível reverter um hash para obter os dados originais?
Não. Funções de hash são unidirecionais por design. Você não pode matematicamente reverter um hash de volta para sua entrada. No entanto, senhas comuns podem ser encontradas em tabelas de busca pré-computadas (tabelas rainbow), por isso senhas devem receber salt antes do hashing.
O que é HMAC?
HMAC (Hash-based Message Authentication Code) combina uma função de hash com uma chave secreta. Ele verifica tanto a integridade quanto a autenticidade dos dados, provando que os dados não foram adulterados e que foram criados por alguém que conhece a chave secreta.
Meus dados são enviados a um servidor ao gerar hashes?
Não. Todo o hashing roda no seu navegador usando a Web Crypto API. Seu texto e arquivos nunca saem do seu dispositivo.
Why should I never use MD5 or SHA-1 for password storage even with a salt?
Both algorithms are extremely fast, which is the opposite of what you want for passwords. An attacker with a stolen hash file can try billions of guesses per second on a GPU. Password-hashing functions like bcrypt, scrypt, and Argon2 are deliberately slow and memory-hard, which forces attackers to spend orders of magnitude more time per guess.
When should I use SHA-512 instead of SHA-256?
On 64-bit CPUs, SHA-512 is often slightly faster than SHA-256 because its inner state and word size are tuned to 64-bit operations. Use SHA-512 when you want a longer digest (128 hex characters) for collision resistance margin, or when you are already in a SHA-512 ecosystem (TLS 1.3 with certain cipher suites, some HMAC implementations).