Para que serve um hash
Uma função de hash criptográfica transforma uma entrada de qualquer tamanho numa impressão digital de comprimento fixo. A mesma entrada sempre gera o mesmo resumo, e mudar um único bit da entrada gera um resumo completamente diferente. Não dá para reconstruir a entrada a partir do resumo e, nos algoritmos modernos, na prática não dá para encontrar duas entradas com o mesmo resumo.
Isso torna os hashes úteis sempre que você precisa saber se duas coisas são idênticas sem compará-las byte a byte:
- Verificar downloads. ISOs de Linux, imagens de firmware e muitos instaladores publicam um SHA-256 ao lado do link de download. Se o seu arquivo der o mesmo valor, ele chegou intacto.
- Encontrar duplicatas. Duas fotos ou documentos com o mesmo SHA-256 são o mesmo arquivo, sejam quais forem os nomes.
- Chaves de cache e ETags. Servidores web e ferramentas de build calculam o hash do conteúdo para saber se ele mudou.
- Integridade em APIs. Webhooks, arquivos de lock de pacotes e atributos de Subresource Integrity dependem de resumos.
- Depuração. Comparar o hash que o seu código calcula com um valor de referência mostra rapidinho se o bug está no hash ou na entrada.
Os cinco algoritmos lado a lado
A ferramenta calcula os cinco de uma vez, então você consegue bater com qualquer formato que um site publique.
- MD5, 128 bits, 32 caracteres hexadecimais. Criado em 1991. Colisões práticas são possíveis desde 2004, então ele não deve ser usado onde um atacante possa forjar a entrada. Ainda é comum para checagens rápidas de duplicatas e checksums legados.
- SHA-1, 160 bits, 40 caracteres hexadecimais. Descontinuado depois da primeira colisão pública, em 2017. O Git historicamente identificava objetos por SHA-1, e por isso ele ainda está em todo lugar.
- SHA-256, 256 bits, 64 caracteres hexadecimais. O padrão atual para checksums, certificados, gerenciadores de pacotes e blockchains.
- SHA-384, 384 bits, 96 caracteres hexadecimais. Uma variante truncada do SHA-512, muito usada em TLS e em hashes de Subresource Integrity.
- SHA-512, 512 bits, 128 caracteres hexadecimais. Mesma família do SHA-256, mas com operações internas de 64 bits, o que pode deixá-lo mais rápido que o SHA-256 em processadores de 64 bits.
Se puder escolher, publique e confira o SHA-256. MD5 e SHA-1 só são aceitáveis para detectar corrupção acidental, não adulteração.
Chegando ao mesmo hash para um texto
Quando o seu resumo difere do de outra pessoa para o "mesmo" texto, a entrada quase nunca é realmente a mesma. O que conferir:
- Quebra de linha no final.
echo hello | sha256sumcalcula o hash dehelloseguido de uma quebra de linha. A caixa de texto aqui calcula o hash exatamente do que você digitou, então os resultados diferem, a menos que você acrescente uma nova linha no final. Na linha de comando,echo -nouprintfevitam o caractere extra. - Finais de linha. O Windows usa CR LF; Linux e macOS usam LF. Um texto de várias linhas colado pode mudar os finais dependendo da origem.
- Codificação. O texto é convertido para UTF-8 antes do hash. Um sistema que calcula o hash de bytes Latin-1 ou UTF-16 vai obter outro resultado para tudo o que for além do ASCII simples, inclusive letras acentuadas.
- Caracteres invisíveis. Espaços não separáveis e caracteres de largura zero copiados de páginas web ou PDFs parecem idênticos na tela.
- Maiúsculas e minúsculas no hexadecimal. Os resumos são exibidos em minúsculas.
A3F…ea3f…são o mesmo valor; compare sem diferenciar maiúsculas de minúsculas.
Calculando o hash de arquivos e verificando checksums
Hash de um arquivo… lê localmente o arquivo escolhido e calcula os cinco resumos a partir dos bytes exatos dele. O nome e a data do arquivo não afetam o resultado; só o conteúdo afeta. A família SHA usa a implementação Web Crypto embutida no navegador; o MD5 é calculado por uma pequena biblioteca JavaScript, porque os navegadores não o oferecem.
Para verificar um download, abra a página de checksums do distribuidor, encontre a linha do seu arquivo e compare com a linha correspondente aqui. Comparar os seis ou oito primeiros e últimos caracteres é uma checagem rápida de bom senso; para segurança de verdade, compare a string inteira. Se os valores diferirem, baixe o arquivo de novo antes de supor adulteração, já que um download interrompido é o motivo mais provável.
O arquivo inteiro é carregado na memória antes do cálculo, então arquivos muito grandes, principalmente de vários gigabytes num celular, podem ficar lentos ou falhar. Nada é enviado.
O que um hash não é
Um hash simples não é forma de guardar senhas. MD5 e a família SHA foram feitos para ser rápidos, o que permite a atacantes testar bilhões de palpites por segundo contra um resumo vazado. Guardar senhas exige uma função propositalmente lenta e com salt, como bcrypt, scrypt ou Argon2. Se você só precisa de um segredo forte, use o gerador de senhas.
Um hash também não é criptografia. Ele é de mão única: não existe chave para recuperar o original.