Uso de OpenSSL EVP interface (lo siguiente es para OpenSSL 1,1):
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <openssl/evp.h>
bool computeHash(const std::string& unhashed, std::string& hashed)
{
bool success = false;
EVP_MD_CTX* context = EVP_MD_CTX_new();
if(context != NULL)
{
if(EVP_DigestInit_ex(context, EVP_sha256(), NULL))
{
if(EVP_DigestUpdate(context, unhashed.c_str(), unhashed.length()))
{
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned int lengthOfHash = 0;
if(EVP_DigestFinal_ex(context, hash, &lengthOfHash))
{
std::stringstream ss;
for(unsigned int i = 0; i < lengthOfHash; ++i)
{
ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
}
hashed = ss.str();
success = true;
}
}
}
EVP_MD_CTX_free(context);
}
return success;
}
int main(int, char**)
{
std::string pw1 = "password1", pw1hashed;
std::string pw2 = "password2", pw2hashed;
std::string pw3 = "password3", pw3hashed;
std::string pw4 = "password4", pw4hashed;
hashPassword(pw1, pw1hashed);
hashPassword(pw2, pw2hashed);
hashPassword(pw3, pw3hashed);
hashPassword(pw4, pw4hashed);
std::cout << pw1hashed << std::endl;
std::cout << pw2hashed << std::endl;
std::cout << pw3hashed << std::endl;
std::cout << pw4hashed << std::endl;
return 0;
}
La ventaja de esta interfaz de nivel superior es que simplemente necesita cambiar la llamada EVP_sha256()
con la función de otro resumen, p. EVP_sha512()
, para usar un resumen diferente. Entonces agrega cierta flexibilidad.
También como una bonificación, sería bueno si fuera el hash en binario :) –
He publicado una nueva respuesta que explica lo que quieres. Puede cerrar esta pregunta como duplicada si esa respuesta ayuda. – AndiDog
@AndiDog - Todo parece funcionar bien, excepto que el compilador no puede encontrar las funciones. Ni siquiera podía encontrar una referencia a SHA1. Además, no se puede encontrar ninguna de las funciones de SHA256 como 'SHA256_Final '. No estoy seguro de lo que estoy haciendo mal, incluí #include "openssl/sha.h" e incluí el include y la biblioteca durante la compilación -I/opt/ssl/include/-L/opt/ssl/lib/-lcrypto –