Se você estiver interessado em detectar somente a corrupção, use o utilitário *sum
, como sha256sum
.
Dentro do diretório a ser protegido, execute o seguinte. Observe o uso de find ... -print0
e xargs -0
para acomodar caminhos com espaços ou outros caracteres especiais.
find . -type f -print0 \
| xargs -0 sha256sum \
> manifest.sum
Em seguida, use o seguinte para validar o conteúdo do arquivo.
sha256sum -c manifest.sum
A saída listará os arquivos com OK
ou FAILED
, e o valor de retorno será 0
(zero) se todos os arquivos tiverem saído ok ou diferente de zero se houver erros.
Este processo validará todos os arquivos no diretório atual e deixará manifest.sum
atrasado.
O ideal seria gerar manifest.sum
na origem (por exemplo, no momento da criação) e distribuí-lo com os arquivos, executando apenas a verificação ( sha256sum -c
) no dispositivo de destino.
Como você mencionou que isso é para um processo de atualização de firmware, recomendo que procure mais do que apenas verificar os dados quanto à corrupção.
Em muitos casos, é benéfico garantir que a atualização sendo aplicada seja genuína e tenha sido fornecida pela origem pretendida ... Se você permitir que qualquer atualização seja aplicada a um sistema, abra-a para fins acidentais. (e potencialmente prejudiciais) atualizações, bem como atualizações maliciosas.
Para resolver isso, você deve procurar assinar a atualização criptograficamente.
- Você poderia dar um jeito de assinar apenas o
manifest.sum
produzido acima (menos sobrecarga de processamento). Ao assinar as somas de verificação, você pode verificar o conteúdo de cada arquivo ... presumindo que o resumo esteja seguro, é claro ... ( MD5 não seria uma boa escolha) - No entanto, pode ser melhor distribuir um arquivo que esteja assinado (e possivelmente criptografado) integralmente e verificado antes mesmo de ser extraído.
Como a saída dos utilitários *sum
é texto ASCII, você pode usar gpg --clearsign
para assinar os dados:
find . -type f -print0 \
| xargs -0 sha256sum \
| gpg --clearsign --default-key 7826F053 \
> manifest.asc
No alvo, você pode verificar a assinatura:
gpg --verify manifest.asc
Em seguida, se, e somente se , a assinatura for válida e de uma origem esperada (você precisará usar --status-fd
para verificar isso), poderá prosseguir para verificar o conteúdo do arquivo :
gpg --decrypt manifest.asc \
| sha256sum -c -
Observe que *sum
deve estar no " fim " do pipeline para garantir que você veja o código de retorno ... como alternativa, você pode usar set -o pipefail
Eu mencionei o uso de --status-fd
acima ... ficou confuso no shell, então você provavelmente vai querer escrever um aplicativo para lidar com isso de forma mais simples ... Algo como isso irá " funcionar "(ou seja: provar um ponto).
A impressão digital da chave usada para assinar o manifesto é: A5C929D6A230C02067720F1DB2B38B43C2ABEB33
.
gpg --status-fd 3 --verify manifest.asc 3>&1 1>/dev/null \
| grep -Eq '^\[GNUPG:\] VALIDSIG A5C929D6A230C02067720F1DB2B38B43C2ABEB33 '