Como Gerar Hash MD5 com C++ e OpenSSL

Indicada apenas para compatibilidade com aplicativos existentes. Em novas aplicações, SHA-1 ou RIPEMD-160 devem ser preferidos.


Como Gerar Hash MD5 com C++ e OpenSSL


Nós já publicamos sobre gerar hash criptográfica com a função SHA256 . Então, para entender melhor esse artigo recomendo você ler, se ainda não leu, o outro artigo:

Como Gerar Hash SHA256 com C++ e OpenSSL

Você vai notar muitas semelhanças com a implementação anterior, a única diferença em si é que a função é diferente, nesse caso usaremos a MD5 .

MD5 é uma função de hash criptograficamente quebrada, mas ainda amplamente usada , produzindo um valor de hash de 128 bits . Embora o MD5 tenha sido inicialmente projetado para ser usado como uma função de hash criptográfica , descobriu-se que ele sofre de extensas vulnerabilidades.

Ela ainda pode ser usado como uma soma de verificação para verificar a integridade dos dados , mas apenas contra corrupção não intencional. Ela permanece adequado para outros fins não criptográficos, por exemplo, para determinar a partição de uma chave específica em um banco de dados particionado e pode ser preferido devido a requisitos computacionais mais baixos do que os algoritmos de hash seguros mais recentes .

Em resumo:

MD2, MD4 e MD5 são recomendados apenas para compatibilidade com aplicativos existentes. Em novas aplicações, SHA-1 ou RIPEMD-160 devem ser preferidos.


Instalando a biblioteca OpenSSL

Antes de qualquer coisa você precisa instalar a biblioteca OpenSSL, use o gerenciador de pacotes da sua distro para isso, exemplo para sistemas que usam APT:

Observação: Geralmente, a maioria dos sistemas já possuem essa biblioteca instalada.

sudo apt install libssl-dev

Utilizando com C++

Para esse exemplo, vamos criar a hash da palavra Terminal Root . Segue o código abaixo:

md5.cpp

#include <iostream>
#include <iomanip>
#include <sstream>
#include <openssl/md5.h>

std::string md5(const std::string &str){
  unsigned char hash[MD5_DIGEST_LENGTH];

  MD5_CTX md5;
  MD5_Init(&md5);
  MD5_Update(&md5, str.c_str(), str.size());
  MD5_Final(hash, &md5);

  std::stringstream ss;

  for(int i = 0; i < MD5_DIGEST_LENGTH; i++){
    ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>( hash[i] );
  }
  return ss.str();
}

int main() {
  std::cout << md5("Terminal Root") << '\n';
  return 0;
}

Para compilar rode:

g++ md5.cpp -lcrypto

A possível e esperada saída será:

a69f0efcca0116a76921947f135ccdac

Para verificar se está correta use, preterivelmente, o comando printf:

printf "Terminal Root" | md5sum

Você pode simplesmente substituir o DIGEST_LENGTH(apesar do tamanho serem os mesmos no cabeçalho haverá outra macro), e os nomes das funções para utilizar para MD2 e MD4(utilizam os cabeçalhos md2.h e md4.h,respectivamente , já a SHA256 usa sha.h) e usar para gerar hash para também essas funções.


Links úteis


cpp openssl criptografia


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!