Gerador de hash
Gere hashes MD5 e SHA de qualquer texto e compare-os com uma soma de verificação esperada.
O que uma função de hash faz realmente
Uma função de hash criptográfica recebe uma entrada de qualquer tamanho e produz uma cadeia de bytes de comprimento fixo — um digest, ou «hash». Dê-lhe uma única letra ou um romance inteiro: o MD5 devolve sempre 16 bytes e o SHA-256 sempre 32. A mesma entrada produz sempre o mesmo digest, e mudar um único bit em qualquer ponto da entrada altera cerca de metade dos bits de saída — por isso dois ficheiros quase idênticos têm hashes completamente desligados um do outro.
A propriedade crucial é que a função só funciona num sentido. Calcular o hash de um ficheiro é rápido; recuperar o ficheiro a partir do hash não é apenas lento, é impossível por princípio, porque uma saída de comprimento fixo não consegue codificar uma entrada ilimitada. Um hash é uma impressão digital, não uma cópia cifrada — não há nada para decifrar.
Para que servem realmente os hashes
- Verificar transferências: um projeto publica o SHA-256 de uma versão, você calcula o hash do ficheiro recebido e digests iguais significam que os bytes chegaram intactos.
- Detetar alterações: sistemas de controlo de versões, cópia de segurança e desduplicação comparam hashes em vez de ficheiros inteiros, porque comparar 32 bytes é muito mais barato do que comparar gigabytes.
- Subresource Integrity: uma página fixa o hash em Base64 de um script que carrega de uma CDN, e o navegador recusa-se a executá-lo se não corresponder.
- Guardar palavras-passe — mas com uma função lenta feita para isso, nunca com um hash simples. Ver abaixo.
Repare no que têm em comum: o hash é um substituto compacto de algo maior, usado para responder à pergunta «isto é a mesma coisa que eu esperava?» sem transmitir nem armazenar a coisa em si.
MD5 e SHA-1 estão quebrados — o que isso significa na prática
Uma função de hash é considerada quebrada assim que alguém consegue construir uma colisão: duas entradas diferentes que produzem o mesmo digest. As colisões de MD5 calculam-se em hardware comum desde 2004, e em 2017 o ataque SHAttered produziu dois ficheiros PDF diferentes com um hash SHA-1 idêntico. É por isso que ambos os algoritmos aparecem assinalados nesta ferramenta.
A consequência prática é mais estreita do que «nunca os use». Uma colisão significa que um atacante que controle os dois ficheiros pode fazer um ficheiro malicioso coincidir com o digest de um inofensivo, portanto MD5 e SHA-1 já não conseguem provar que um ficheiro não foi adulterado por alguém hostil. Continuam perfeitamente úteis para detetar corrupção acidental — uma transferência truncada, um bit trocado num disco — e vai continuar a encontrá-los em sistemas antigos, em cabeçalhos ETag e em manifestos de pacotes antigos que ninguém vai reescrever.
A regra prática: se a pergunta é «isto danificou-se em trânsito?», o MD5 chega. Se a pergunta é «alguém substituiu isto de propósito?», use SHA-256 ou melhor.
Nunca guarde uma palavra-passe com estes
MD5, SHA-1 e até SHA-256 são concebidos para serem rápidos, e a rapidez é exatamente a propriedade errada para guardar palavras-passe. Uma GPU moderna calcula milhares de milhões de hashes SHA-256 por segundo, por isso uma base de dados roubada de palavras-passe simplesmente hasheadas pode ser atacada a uma escala enorme — e como a mesma palavra-passe produz sempre o mesmo digest, as tabelas pré-calculadas tornam o ataque ainda mais barato.
Guardar palavras-passe exige uma função deliberadamente lenta, com salt e exigente em memória: Argon2id, scrypt ou bcrypt. Acrescentam um salt aleatório único por palavra-passe, de modo que palavras-passe iguais não partilham digest, e o seu custo é ajustável, de modo que cada tentativa custa ao atacante tempo e memória reais. Esta ferramenta serve para somas de verificação e impressões digitais, não para guardar palavras-passe.
Ler e comparar digests
O mesmo digest pode ser escrito de mais do que uma maneira. O hexadecimal em minúsculas é o que as ferramentas padrão de linha de comandos imprimem, e é normalmente aquilo com que vai comparar:
md5sum file.iso # Linux sha256sum file.iso # Linux shasum -a 256 file.iso # macOS Get-FileHash file.iso -Algorithm SHA256 # PowerShell (imprime em maiúsculas) certutil -hashfile file.iso SHA256 # Windows (imprime em maiúsculas)
Em hexadecimal, maiúsculas ou minúsculas não têm significado nenhum — o PowerShell e o certutil imprimem em maiúsculas, as ferramentas Unix em minúsculas, e é exatamente o mesmo valor. É por isso que a caixa de comparação desta ferramenta ignora as maiúsculas em hexadecimal. Com o Base64 é outra história: é uma codificação mais densa dos mesmos bytes, usada pelo Subresource Integrity e por várias APIs, e aí as maiúsculas contam — por isso a comparação é exata.
Um último hábito que vale a pena criar: nunca compare dois digests longos a olho para decidir se coincidem. O olho humano é muito bom a ver aquilo que espera ver, e o facto de os primeiros e os últimos caracteres coincidirem não quer dizer nada. Cole o valor esperado e deixe a comparação ser exata.
Perguntas frequentes
- O meu texto é enviado para um servidor?
- Não. Cada digest é calculado no seu navegador — a família SHA através da Web Crypto API e o MD5 através de JavaScript a correr na sua própria máquina. Nada do que escrever sai do seu dispositivo.
- Um hash pode ser revertido para recuperar o texto original?
- Não. Um hash é uma impressão digital de comprimento fixo, não uma cópia cifrada, e o original não pode ser recuperado a partir dele. Os sites que anunciam «desencriptação de MD5» limitam-se a procurar o seu hash numa tabela de entradas comuns já calculadas, o que só funciona com texto curto ou previsível.
- Porque é que MD5 e SHA-1 têm aqui um aviso?
- Porque em ambos as colisões são praticáveis: podem construir-se duas entradas diferentes que partilham um digest. Isso torna-os inadequados para provar que um ficheiro não foi adulterado de propósito, embora continuem úteis para apanhar corrupção acidental.
- Que algoritmo devo usar?
- O SHA-256 é a escolha por omissão sensata e é o que a maioria dos projetos publica hoje. O SHA-512 não é significativamente mais seguro para este fim, mas é mais rápido em hardware de 64 bits. Use MD5 ou SHA-1 apenas quando algo que não controla já os exigir.
- Posso usar isto para uma palavra-passe?
- Pode, mas não deve guardar o resultado. Guardar palavras-passe exige uma função lenta e com salt como Argon2id, scrypt ou bcrypt — hashes rápidos como estes são precisamente o que torna fáceis de quebrar as bases de dados roubadas.
- Porque é que os hashes mudam quando acrescento um espaço ou uma quebra de linha?
- Porque os espaços fazem parte da entrada. Uma quebra de linha no fim é a razão mais comum para um hash não corresponder ao esperado — texto copiado de um terminal ou de um editor traz muitas vezes uma que não se vê.
- Lida corretamente com hebraico, árabe e emojis?
- Sim. O texto é codificado em bytes UTF-8 antes de ser processado, que é o padrão usado por todas as outras ferramentas, portanto processar «שלום» ou um emoji aqui dá o mesmo digest que md5sum ou sha256sum num ficheiro UTF-8 com esses mesmos caracteres.
- Porque é que processa texto mas não ficheiros?
- A Web Crypto não tem uma API de digest em fluxo, por isso um ficheiro teria de ser lido inteiro para a memória antes de poder ser processado, e o MD5 escrito à mão seria visivelmente lento com um ficheiro grande. Processar texto cobre o caso comum com honestidade, em vez de oferecer um processamento de ficheiros que bloqueia a página.