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:
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.
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
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.