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
- GNU Coreutils: md5sum invocation — Documentação oficial do comando md5sum com todas as opções disponíveis
- GNU Coreutils: sha256sum invocation — Documentação oficial dos utilitários SHA-2, incluindo sha256sum
- Linuxize: How to Verify File Integrity with sha256sum — Tutorial prático sobre verificação de integridade com exemplos reais
- DigitalOcean: How to Use Checksums in Linux — Guia completo cobrindo md5sum, sha256sum e casos de uso avançados
- Arch Linux Wiki: Integrity Checking — Documentação técnica sobre verificação de integridade, incluindo boas práticas e scripts
- Red Hat Blog: Understanding and Using Checksums — Artigo da Red Hat sobre conceitos de checksums e implementação prática