Hashes de arquivos: MD5, SHA-1 e SHA-256 para verificar downloads

Um hash de arquivo é um valor de comprimento fixo calculado a partir do conteúdo de um arquivo, comumente usado para comparar um arquivo baixado com uma cópia de referência. Os mesmos bytes e o mesmo algoritmo produzem o mesmo resultado, mas arquivos diferentes podem, teoricamente, compartilhar um hash. Para a verificação rotineira de arquivos, prefira SHA-256 quando o distribuidor fornecê-lo e verifique de onde veio o valor de referência.

O que um hash de arquivo representa?

Uma função de hash calcula um resumo chamado valor de hash ou digest. MD5, SHA-1 e SHA-256 têm cada uma um comprimento de saída fixo: um pequeno documento e um instalador grande produzem digests igualmente longos quando você usa o mesmo algoritmo. Um digest não é uma cópia comprimida da qual você possa reconstruir o arquivo. A visão geral das funções de hash do NIST explica essas propriedades e os requisitos de segurança relevantes.

Ferramentas comuns de hashing de arquivos leem os bytes dentro de um arquivo, e não seu nome ou localização na pasta. Renomear um arquivo sem alterar seu conteúdo mantém o hash inalterado. Por outro lado, dois documentos que exibem o mesmo texto podem conter bytes diferentes devido a quebras de linha, codificação de caracteres ou metadados armazenados dentro do arquivo.

Um hash pode ser descrito como uma impressão digital, mas não é um identificador absolutamente único. Uma colisão ocorre quando entradas diferentes produzem o mesmo digest. Um hash criptográfico seguro é projetado para tornar a localização de tais entradas impraticável. MD5 e SHA-1 não atendem mais aos requisitos de segurança para aplicações resistentes a colisão.

MD5 vs SHA-1 vs SHA-256

MD5 significa Algoritmo de Resumo de Mensagem 5; SHA significa Algoritmo de Hash Seguro. SHA-256 pertence à família SHA-2 e produz 256 bits. Ferramentas geralmente exibem o resultado como texto hexadecimal. Cada caractere hexadecimal representa quatro bits, fornecendo os seguintes tamanhos:

Algoritmo Tamanho do resumo Comprimento hexadecimal Escolha para verificação de arquivo
MD5 128 bits · 16 bytes 32 caracteres Pode ser necessário para comparar um checksum legado, mas não deve ser usado como proteção contra manipulação maliciosa.
SHA-1 160 bits · 20 bytes 40 caracteres Pode ser comparado com referências legadas; evite escolhê-lo para novas aplicações de segurança.
SHA-256 256 bits · 32 bytes 64 caracteres Uma escolha prática para verificações de integridade de download de rotina quando o distribuidor fornece um valor SHA-256.

As limitações de tamanho e resistência a colisões do MD5 são discutidas em considerações de segurança do MD5 na RFC 6151. As especificações do SHA aparecem em Padrão de Hash Seguro do NIST. Detectar um erro de transmissão acidental e se proteger contra um atacante que pode alterar um arquivo são requisitos diferentes.

Sempre compare hashes do mesmo algoritmo. Um valor SHA-256 calculado localmente não pode ser verificado com um valor MD5 publicado. Além disso, uma saída de 256 bits não implica força de 256 bits contra todo tipo de ataque. Veja Orientações do NIST sobre algoritmo e força de segurança para limitações do SHA-1 e as diferenças entre tipos de ataque.

O que acontece quando um caractere muda?

Este exemplo em Python calcula SHA-256 para os bytes ASCII abc e abC. Apenas o caractere final muda, e nenhuma das entradas inclui uma nova linha no final. A saída mostrada foi verificada com o Python 3.12; ambos os digests contêm 64 caracteres hexadecimais.

import hashlib

for data in (b"abc", b"abC"):
    print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())

Saída:

abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76

Essas entradas de aparência semelhante produzem digests muito diferentes. O exemplo não prova que todo par de entradas diferentes deve ter hashes diferentes. Saída determinística para a mesma entrada, possíveis colisões e resistência a ataques deliberados são propriedades separadas.

Como verificar um arquivo baixado

A verificação de integridade verifica se os dados diferem de uma referência. Calcular apenas um novo resumo não é uma verificação: você precisa de um hash de referência confiável para compará-lo.

  1. Obtenha o hash de referência na página oficial de download do distribuidor ou em outro canal de distribuição confiável.
  2. Confirme que o sistema operacional, a arquitetura da CPU, a versão e o nome do arquivo correspondem ao download. Verifique qual algoritmo a referência usa.
  3. Espere o download terminar e, em seguida, calcule seu hash com o mesmo algoritmo. Não modifique nem substitua o arquivo enquanto ele está sendo lido.
  4. Para SHA-256, compare todos os 64 caracteres hexadecimais, em vez de apenas o início. Letras hexadecimais maiúsculas e minúsculas representam os mesmos valores.
  5. Se os valores diferirem, não execute nem instale o arquivo. Verifique novamente o alvo da comparação, depois baixe-o novamente do canal oficial e repita a verificação.

Se um atacante puder substituir tanto o arquivo quanto seu hash de referência, valores correspondentes não estabelecem quem o forneceu. Uma correspondência é uma comparação com os dados de referência, não uma prova de que um arquivo está livre de malware. Quando somas de verificação assinadas ou assinaturas digitais são fornecidas, siga as instruções do distribuidor e verifique-as usando uma chave pública confiável.

Comandos SHA-256 para Windows, Linux e macOS

example.iso abaixo é um nome de arquivo ilustrativo. Substitua-o e o caminho pelo seu download real, e coloque entre aspas os caminhos que contêm espaços. Esses comandos leem o arquivo para calcular seu resumo; eles não alteram seu conteúdo.

Windows: Get-FileHash no PowerShell

Abra o PowerShell pelo menu Iniciar e execute o seguinte comando. -LiteralPath trata o caminho literalmente em vez de interpretar caracteres curinga. -Algorithm SHA256 seleciona explicitamente o algoritmo.

Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List

Verifique os campos Algorithm, Hash e Path. SHA-256 é o padrão, mas especificá-lo torna a comparação mais clara. A documentação Get-FileHash da Microsoft descreve os algoritmos suportados e a saída. Se o arquivo não puder ser encontrado, verifique seu caminho e extensão reais no Explorador de Arquivos.

Linux: sha256sum

Em um ambiente com GNU Coreutils sha256sum instalado, abra um terminal e execute este comando. A saída usual inclui o resumo seguido pelo nome do arquivo.

sha256sum "/home/user/Downloads/example.iso"

Se o distribuidor fornecer um arquivo SHA256SUMS no formato GNU, coloque-o junto aos arquivos para verificar, abra um terminal nessa pasta e verifique a lista com o comando abaixo. Os caminhos nomeados na lista devem existir. Uma lista completa pode relatar arquivos ausentes se você baixou apenas algumas de suas entradas.

sha256sum --check SHA256SUMS

Entradas correspondentes são relatadas como OK; incompatibilidades são relatadas como falhas. A própria lista de soma de verificação também deve vir de uma fonte confiável. Consulte o manual dos utilitários SHA-2 do GNU. Se o comando estiver ausente, verifique se o Coreutils está instalado em sua distribuição.

macOS: shasum

Se shasum estiver disponível no seu terminal, selecione explicitamente SHA-256 com -a 256. Sem essa opção, shasum padrão será SHA-1, o que pode causar uma incompatibilidade de algoritmo.

shasum -a 256 "/Users/user/Downloads/example.iso"

Para uma lista de verificação compatível, use shasum -a 256 -c SHA256SUMS. A documentação do mantenedor do shasum explica a seleção de algoritmos e -c. Estas instruções para macOS são baseadas na documentação da ferramenta em vez de uma execução no macOS; o método Python abaixo é uma alternativa quando a ferramenta não está disponível.

Calcule o SHA-256 de um arquivo grande com Python

Com o Python 3 instalado, você pode usar o módulo da biblioteca padrão hashlib. Salve este código como hash-file.py. Ele abre o arquivo em modo binário, rb, e lê um mebibyte (MiB) de cada vez, em vez de carregar o arquivo inteiro na memória. A sintaxe de expressão de atribuição requer Python 3.8 ou posterior.

import hashlib
import sys

if len(sys.argv) != 2:
    raise SystemExit("Usage: python hash-file.py FILE")

digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
    while chunk := file.read(1024 * 1024):
        digest.update(chunk)

print(digest.hexdigest())

A partir da pasta do script, passe o caminho do seu arquivo real da seguinte forma. Se o seu comando Python 3 for python3 ou py, use esse comando no lugar de python.

python hash-file.py "example.iso"

A saída é um resumo SHA-256 hexadecimal de 64 caracteres. Os mesmos bytes produzem o mesmo resultado que o PowerShell e outras ferramentas, embora o uso de letras maiúsculas e minúsculas possa variar. A documentação oficial do módulo hashlib do Python explica update() e hexdigest(). Arquivos pequenos, vazios e processados em vários blocos foram verificados no Windows com Python 3.12.14 e PowerShell 7.6.5; os resultados coincidiram.

O que verificar quando os hashes não coincidem

  • Arquivos de lançamento diferentes: verifique x64 versus ARM64, instaladores versus arquivos compactados, ou diferentes versões.
  • Algoritmos diferentes: MD5, SHA-1 e SHA-256 produzem resumos diferentes. Verifique novamente os nomes dos algoritmos.
  • Downloads incompletos: confirme se o download foi concluído e se a ferramenta de download não relatou erros.
  • Extração ou conversão: o hash de referência de um arquivo compactado não se aplica a um arquivo extraído dele. Salvar em um editor, converter finais de linha e recomprimir imagens pode alterar os bytes.
  • Erros de caminho ou cópia: verifique qual arquivo foi realmente lido pelo comando e confira o valor de referência completo. Evite um digest truncado ou copiado de um arquivo diferente.

Não substitua um valor de referência inexplicado pelo seu valor calculado para forçar uma correspondência. Confirme primeiro o canal de distribuição e o destino. Se um download novo ainda apresentar diferenças, verifique as instruções do distribuidor ou se o lançamento foi corrigido.

O que os hashes podem e não podem fazer

Uso Função do hash Requisitos adicionais
Integridade do arquivo Compare o conteúdo atual do arquivo com um resumo de referência. A fonte de referência e o algoritmo devem ser apropriados.
Detecção de duplicatas Agrupe arquivos com hashes correspondentes como candidatos a duplicatas. Considere a possibilidade de colisões e compare bytes quando a igualdade exata for essencial.
Assinaturas digitais Um esquema de assinatura pode usar um resumo dos dados. Calcular apenas um hash não cria uma assinatura nem autentica o autor.
Armazenamento de senha A verificação de senha também utiliza mecanismos baseados em hash. Use um método dedicado de armazenamento de senhas em vez de apenas aplicar hash em arquivos com SHA-256.

Calcular um hash não é cifrar dados. A cifragem permite a recuperação do texto original com a chave apropriada; um hash não é um formato para reconstruir sua entrada. No entanto, entradas curtas ou previsíveis podem ser adivinhados e seus hashes comparados, portanto, apenas aplicar hash em algo não garante sigilo.

Para senhas, escolha uma implementação confiável de um esquema dedicado de hash de senhas, como Argon2id, com um custo apropriado e um salt exclusivo (sal), em vez de MD5, SHA-1 ou SHA-256 simples. O salt é um valor por senha que torna os ataques de adivinhação pré-computados menos eficazes. O OWASP Password Storage Cheat Sheet explica por que o armazenamento de senhas e o hash de arquivos precisam de designs diferentes. Para verificações de download, os passos essenciais são calcular o SHA-256, obter uma referência confiável e comparar o digest completo.