Por que o crc32 diz que alguns dos meus arquivos são 'BAD'?

2

Eu usei crc32 para comparar alguns arquivos com um backup deles. Dos 3556 arquivos, 11 foram relatados como 'BAD', como no exemplo a seguir:

9be46354        ./9836Feeding_the_dog_.mpeg   BAD 9be46354 != 9836Feed

No entanto, os arquivos não são ruins, mas por algum motivo crc32 comparou a soma de verificação calculada com parte do nome do arquivo.

Eu então tentei uma experiência:

$ echo 12345 > 9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6

Portanto, desta vez crc32 parece não ter comparado a soma de verificação com o nome do arquivo, e o arquivo não é 'BAD'.

O que está acontecendo aqui? Isso acontece com outras somas de verificação?

    
por EmmaV 11.11.2018 / 21:45

1 resposta

2

O executável crc32 que você está usando é um script Perl distribuído junto com o módulo Archive::Zip Perl.

O script crc32 Perl é bem curto e tem essa pequena coisa:

if ( $file =~ /[^[:xdigit:]]([[:xdigit:]]{8})[^[:xdigit:]]/ ) {
    my $filenameCrc = $1;
    if ( lc($filenameCrc) eq lc($fileCrc) ) {
        print("\tOK")
    } else {
        print("\tBAD $fileCrc != $filenameCrc");
    }
}

Ou seja, se o nome do caminho do arquivo contiver oito dígitos hexadecimais consecutivos, precedidos e seguidos por pelo menos um dígito não hexadecimal, esse número hexadecimal será comparado com a soma de verificação CRC32 do arquivo.

No seu caso, você está executando crc32 on ./9836Feeding_the_dog_.mpeg . Este nome de caminho contém alguns dígitos não hexadecimais ( ./ ) seguidos por exatamente oito dígitos hexadecimais ( 9836Feed ) e, em seguida, algo não hexadecimal novamente. 9836Feed não é a soma de verificação CRC32 do arquivo, então ele reclama.

Exemplo que aciona esse comportamento "não é BAD":

$ cat 261dafe6_file
12345
$ crc32 ./261dafe6_file
261dafe6        OK

Recriando seu teste e provocando a resposta "BAD" adicionando ./ na frente do nome do caminho do arquivo:

$ echo 12345 >9836Feeding_the_dog_.mpeg
$ crc32 9836Feeding_the_dog_.mpeg
261dafe6

$ crc32 ./9836Feeding_the_dog_.mpeg
261dafe6        BAD 261dafe6 != 9836Feed

Como o executável crc32 não está documentado, obviamente é um pouco estranho e não é amplamente usado (eu não sabia sobre isso e tinha que rastreá-lo, mas isso pode não dizer muito) eu sugeriria usar alguma outra ferramenta para calculando as somas de verificação dos arquivos. A ferramenta md5sum do GNU coreutils é amplamente usada, e em sistemas BSD você pode usar md5 . Há também utilitários para calcular hashes mais strongs (SHA1, SHA256 e SHA512 e outros são suportados por utilitários disponíveis).

(Por "dígito não hexadecimal" quero dizer "algo que não é um dígito hexadecimal")

    
por 11.11.2018 / 22:10