Como automatizar a comparação de valores de hash md5sum para um grande número de arquivos

28

Posso verificar o hash md5sum de um arquivo em um terminal como,

$ md5sum my_sensitive_file
8dad53cfc973c59864b8318263737462 my_sensitive_file

Mas a parte difícil é comparar o valor do hash com o valor exato.

É difícil comparar a saída de 32 caracteres com o valor de hash original / exato de qualquer humano para um grande número de arquivos. Antes de tudo, o trabalho seria muito monótono e há um grande escopo de erros.

É possível automatizar o processo de comparação, preferencialmente na CLI?

souravc
fonte

Respostas:

39

Por exemplo, eu tenho um arquivo chamado test_binary.

A soma MD5 do teste de arquivo é ef7ab26f9a3b2cbd35aa3e7e69aad86c

Para testá-lo, execute automaticamente:

$ md5sum -c <<<"ef7ab26f9a3b2cbd35aa3e7e69aad86c *path/to/file/test_binary"
test_binary: OK

ou

$ echo "595f44fec1e92a71d3e9e77456ba80d1  filetohashA.txt" | md5sum -c -

Citação de man

   -c, --check
          read MD5 sums from the FILEs and check them

Citações do wiki

Nota: Deve haver dois espaços entre cada valor md5sum e nome do arquivo para serem comparados. Caso contrário, o seguinte erro resultará: "nenhuma linha de soma de verificação MD5 formatada corretamente encontrada".

Link para wiki

Além disso, você pode apenas ler os hashes MD5 do arquivo

$ md5sum -c md5sum_formatted_file.txt

Está esperando arquivo com formato:

<md5sum_checksum><space><space><file_name>

Sobre *e <space>após o hash da soma MD5. Há pouca nota no homem:

 When  checking,  the
       input  should  be a former output of this program.  The default mode is
       to print a line with checksum, a character indicating input  mode  ('*'
       for binary, space for text), and name for each FILE.

E aqui está o link para o stackoverflow, onde encontrei a resposta na pergunta, por que, às vezes, devemos distinguir binaryarquivos e textarquivos.


c0rp
fonte
3
O asterisco é necessário?
Jobin
Interesting question. I always using with *, but wiki said that it should be two spaces. I will search...
c0rp
@souravc ok, eu encontrei informações sobre *, será atualizado em breve
c0rp
@Jobin eu adiciono informações *para responder
c0rp
Isso faz sentido. Marcado com +1
jobin
2

Uma possibilidade é usar o utilitário cfv

sudo apt-get install cfv

O CFV suporta muitos tipos de hashes e testes e criação de arquivos hash.

# List the files
$ ls
test.c
# Create a hash file
$ cfv -tmd5 -C
temp.md5: 1 files, 1 OK.  0.001 seconds, 302.7K/s
# Test the hash file
$ cfv -tmd5 -T
temp.md5: 1 files, 1 OK.  0.001 seconds, 345.1K/s
# Display the hash file
$ cat *.md5
636564b0b10b153219d6e0dfa917d1e3 *test.c
Elliott Frisch
fonte
1
obrigado por sua resposta, mas ele precisa instalar outro utilitário. Ao mesmo tempo, também fornece suporte para outro formato. É bom saber sobre isso. Mas, no contexto atual, irei com a outra resposta. Enfim +1 de mim.
Souravc
1

Sim, o asterisco *é necessário para este comando. Dê uma olhada neste exemplo.

Este é o arquivo binário, e digamos que o valor correto do md5sum seja exampleofcorrectmd5value00000000(32 caracteres hexadecimais)

[root@Linux update]# ls -lh
total 137M
-rw-r--r-- 1 root root 137M Nov  5 13:01 binary-file.run.tgz
[root@Linux update]# 

-c, --check

leia as somas MD5 dos arquivos e verifique-as

Se o valor md5sum corresponder ao arquivo binário, você obterá esta saída

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000" *binary-file.run.tgz"
binary-file.run.tgz: OK
[root@Linux ~]# 

E é aí que o valor md5sum não corresponde

[root@Linux update]# md5sum -c <<< "exampleofwrongmd5value0000000000 *binary-file.run.tgz"
binary-file.run.tgz: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@Linux update]# 

Sem asterisco *, você receberá a seguinte mensagem de erro, mesmo que o valor md5 esteja correto

[root@Linux ~]# md5sum -c <<< "exampleofcorrectmd5value00000000 binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

Além disso, você receberá a mesma mensagem de erro se o md5sum não tiver 32 caracteres hexadecimais. Neste exemplo, ele possui apenas 31 caracteres.

[root@Linux ~]# md5sum -c <<< "exampleofmd5valuelessthan32char *binary-file.run.tgz" 
md5sum: standard input: no properly formatted MD5 checksum lines found
[root@Linux ~]# 

Solução para muitos arquivos

Se você possui muitos arquivos e deseja automatizar o processo, siga estas etapas:

user@Ubuntu:~$ ls -lh
total 12K
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-a
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-b
-rw-rw-r-- 1 user user 4 Nov  5 14:54 file-c
user@Ubuntu:~$ 

Gere md5sum para cada arquivo e salve-o em md5sum.txt

user@Ubuntu:~$ md5sum * | tee md5sum.txt
0bee89b07a24ae27c83fc3d5951213c1  file-a
1b2297c171a9a450d184871ccf6c9ad4  file-b
7f4d13d9b0b6ac086fd68637067435c5  file-c
user@Ubuntu:~$ 

Para verificar md5sum para todos os arquivos, use o seguinte comando.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: OK
file-c: OK
user@Ubuntu:~$ 

Este é um exemplo se o valor md5sum não corresponder ao arquivo. Nesse caso, vou modificar o file-bconteúdo

user@Ubuntu:~$ echo "new data" > file-b 
user@Ubuntu:~$ 

Veja, esta é a mensagem de erro. Espero que isto ajude.

user@Ubuntu:~$ md5sum -c md5sum.txt 
file-a: OK
file-b: FAILED
file-c: OK
md5sum: WARNING: 1 computed checksum did NOT match
user@Ubuntu:~$ 
Charlotte Russell
fonte