Sem título 1

Geração de MD5 utilizando C com OpenSSL e Python

Atualmente o MD5 é utilizado para muitas finalidades, sendo uma delas a verificação da integridade de arquivos. Para tal é possível utilizar o binário md5sum, presente no pacote coreutils. Mas algumas vezes é necessário fazer esta verificação dentro de um programa, podendo é claro chamar o md5sum de dentro do programa, mas este problema pode ser melhor resolvido utilizando a biblioteca OpenSSL, que contém funções para geração de MD5. Segue abaixo um exemplo utilizando a linguagem C:

Segue agora uma explicação sobre o código acima:


Verificação de parâmetros. É necessário passar um parâmetro para o programa, sendo que este parâmetro precisa ser o caminho para um arquivo. Após checar o parâmetro, o arquivo é aberto para leitura.


O código cria uma variável de “contexto de MD5” e o inicia. Esta variável irá conter todo o conteúdo do arquivo passado como parâmetro para então poder gerar o MD5.


Nesta parte do código o arquivo então é lido, e a cada 1024 bytes lidos o contexto é atualizado com o conteúdo do arquivo. A chamada fread é quem faz esta leitura, e a cada leitura a variável buf recebe os 1024 bytes, e é com a variável que o contexto é atualizado.


Após ler todo o conteúdo do arquivo, nós então podemos fechá-lo. A chamada MD5_Final recebe um contexto e gera o MD5. Este MD5 gerado então é colocando na variável digest.


Nesta parte nós convertemos o digest, que é um unsigned char para um “signed char”. Para tal, precisamos pegar a forma hexadecimal de cada byte do digest e alocar dentro de converted. Como a representação de cada bytes em hexadecimal tem o tamanho de dois bytes, reservar dois bytes do “converted” para cada bytes lido do “digest”. E após este, o MD5 gerado é impresso.

Antes de compilarmos o pacote, é necessário ter o pacote com a biblioteca do OpenSSL. Para instalar em distribuições derivadas do Red Hat, execute:
sudo yum install openssl-devel

Já para instalar em distribuições derivadas do Debian, execute:
sudo apt-get install libssl-dev

Tendo instalado o pacote, vamos compilar o programa com o GCC e linkar com a biblioteca crypto do OpenSSL:
gcc md5_generator.c -o md5_generator -lcrypto

Após compilador, vamos fazer um teste utilizando o programa compilador e comprar a saída do programa md5sum:
[[email protected] md5]$ ./md5_generator md5_generator.c
354218ad04939339944ce5994504d6ad md5_generator.c
[[email protected] md5]$ md5sum md5_generator.c
354218ad04939339944ce5994504d6ad md5_generator.c

Após executar o programa compilado e o md5sum no arquivo fonte do programa, verificamos que ambos mostram o mesmo valor.

Agora vejamos como fazer o MD5 com o Python:

Como já era esperado, o código em python parece mais simples do que a versão em C. Vejamos agora uma breve explicação sobre este código:


Esta parte do código importa o módulo hashlib (necessário para gerar o MD5), valida o parâmetro do programa, e abre o arquivo. Estas mesmas verificações são feitas no código em C.


Aqui é então criada um objeto md5, que seria equivalente ao MD5_Context do C, e então o arquivo do parâmetro vai sendo lido e o md5 é atualizado.


O arquivo é então fechado e o “digest” é então impressora já na forma em hexadecimal.

Podemos testar novamente este programa fazendo o MD5 do próprio script em python:
[[email protected] md5]$ python md5_generator.py md5_generator.py
3c7a3dc1955f630924c555d5f5331528 md5_generator.py
[[email protected] md5]$ md5sum md5_generator.py
3c7a3dc1955f630924c555d5f5331528 md5_generator.py

Espero que tenham gostado do artigo, e que ele seja útil se acaso precisarem deste tipo de recurso. Não se esqueça de se inscrever nas redes sociais e no nosso feed para saber quando um novo artigo é postado. Até mais!