Checksums: md5sum, sha256sum e verificação de integridade

1. Conceitos Fundamentais de Checksums

Um checksum é um valor hash criptográfico gerado a partir de um conjunto de dados, funcionando como uma "impressão digital" do arquivo. A principal característica desses algoritmos é que qualquer alteração mínima no arquivo original produz um hash completamente diferente, permitindo detectar corrupções ou modificações não autorizadas.

Os algoritmos mais comuns no ambiente Bash são:

  • md5sum: Gera hashes de 128 bits (32 caracteres hexadecimais). Embora ainda amplamente utilizado, possui vulnerabilidades conhecidas de colisão.
  • sha256sum: Gera hashes de 256 bits (64 caracteres hexadecimais). Parte da família SHA-2, considerado seguro para a maioria dos casos de uso.
  • sha1sum: Hash de 160 bits, atualmente considerado inseguro.
  • sha512sum: Hash de 512 bits, oferecendo maior segurança porém com maior custo computacional.

É importante distinguir verificação de integridade (garantir que o arquivo não foi corrompido) de autenticação (garantir a origem do arquivo). Checksums sozinhos não provam autenticidade — para isso, combinamos com assinaturas digitais (GPG).

2. Comandos Básicos: md5sum e sha256sum

A sintaxe é direta e idêntica para ambos os comandos:

md5sum arquivo.txt
sha256sum arquivo.txt

A saída padrão segue o formato: hash nome_do_arquivo. Para múltiplos arquivos:

sha256sum arquivo1.txt arquivo2.txt arquivo3.txt

Quando a entrada vem do stdin, o nome do arquivo é substituído por -:

echo "conteúdo" | md5sum

3. Verificação de Integridade com Arquivos .md5 / .sha256

Para criar um arquivo de checksum:

md5sum documento.pdf > documento.pdf.md5
sha256sum documento.pdf > documento.pdf.sha256

Para verificar automaticamente:

md5sum -c documento.pdf.md5
sha256sum -c documento.pdf.sha256

A saída indicará "OK" para arquivos íntegros e "FAILED" para arquivos corrompidos ou ausentes. Exemplo prático:

$ sha256sum -c checksums.sha256
documento.pdf: OK
foto.jpg: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

4. Trabalhando com Múltiplos Arquivos e Diretórios

Para gerar checksums recursivamente em um diretório:

find /caminho/diretorio -type f -exec sha256sum {} \; > checksums.sha256

Ou usando xargs para melhor performance:

find /caminho/diretorio -type f -print0 | xargs -0 sha256sum > checksums.sha256

Para verificar ignorando arquivos que não existem mais:

sha256sum -c --ignore-missing checksums.sha256

Isso é útil em verificações periódicas onde alguns arquivos podem ter sido removidos intencionalmente.

5. Comparação de Checksums em Scripts

Em scripts, frequentemente precisamos extrair apenas o hash. Usando awk:

hash=$(md5sum arquivo.txt | awk '{print $1}')

Ou cut:

hash=$(sha256sum arquivo.txt | cut -d' ' -f1)

Comparação direta entre dois arquivos:

if [ "$(md5sum arquivo1.txt | cut -d' ' -f1)" = "$(md5sum arquivo2.txt | cut -d' ' -f1)" ]; then
    echo "Arquivos idênticos"
else
    echo "Arquivos diferentes"
fi

Exemplo mais completo com verificação de download:

#!/bin/bash
ARQUIVO="ubuntu-22.04.iso"
HASH_ESPERADO="f8e4a549c07a2d8e9e8c8a8b8c8d8e8f8a8b8c8d8e8f8a8b8c8d8e8f8a8b8c"

HASH_REAL=$(sha256sum "$ARQUIVO" | awk '{print $1}')

if [ "$HASH_REAL" = "$HASH_ESPERADO" ]; then
    echo "✓ Integridade verificada com sucesso"
else
    echo "✗ Falha na verificação de integridade"
    echo "Esperado: $HASH_ESPERADO"
    echo "Obtido:   $HASH_REAL"
    exit 1
fi

6. Checksums em Pipeline e Redirecionamento

Podemos gerar checksums de streams sem criar arquivos intermediários:

tar czf - /diretorio | sha256sum

Para verificar um stream contra um hash conhecido:

echo "dados importantes" | sha256sum -c <(echo "hash_esperado -")

Isso é particularmente útil em pipelines de backup:

pg_dump banco | gzip | tee backup.sql.gz | sha256sum > backup.sha256

7. Boas Práticas e Casos de Uso Avançados

Verificação de Downloads

Sempre compare o checksum oficial (geralmente disponível no site do software) com o hash do arquivo baixado:

wget https://exemplo.com/software.tar.gz
wget https://exemplo.com/software.tar.gz.sha256
sha256sum -c software.tar.gz.sha256

Backup com rsync e Checksums

Para verificar integridade após sincronização:

rsync -avz /origem/ /destino/
find /origem/ -type f -exec sha256sum {} \; > origem.sha256
cd /destino && sha256sum -c /caminho/origem.sha256

Limitações do MD5

Embora rápido, md5sum não deve ser usado para verificação de segurança. Colisões podem ser criadas intencionalmente. Prefira sha256sum para:

  • Downloads de software crítico
  • Verificação de backups importantes
  • Ambientes onde a integridade é crucial

Assinatura Digital com GPG

Para autenticação, assine o arquivo de checksums:

sha256sum arquivos* > checksums.sha256
gpg --detach-sign --armor checksums.sha256
gpg --verify checksums.sha256.asc checksums.sha256

Isso garante que o arquivo de checksums não foi adulterado e que veio de uma fonte confiável.

Referências