Come posso generare hash SHA1 o SHA2 usando la libarary OpenSSL?Genera hash SHA in C++ usando la libreria OpenSSL
Ho cercato su google e non sono riuscito a trovare alcuna funzione o codice di esempio.
Come posso generare hash SHA1 o SHA2 usando la libarary OpenSSL?Genera hash SHA in C++ usando la libreria OpenSSL
Ho cercato su google e non sono riuscito a trovare alcuna funzione o codice di esempio.
Dalla riga di comando, è semplicemente:
printf "compute sha1" | openssl sha1
è possibile richiamare la libreria in questo modo:
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
int main()
{
unsigned char ibuf[] = "compute sha1";
unsigned char obuf[20];
SHA1(ibuf, strlen(ibuf), obuf);
int i;
for (i = 0; i < 20; i++) {
printf("%02x ", obuf[i]);
}
printf("\n");
return 0;
}
OpenSSL ha un orribile documentation senza esempi di codice, ma qui sei:
#include <openssl/sha.h>
bool simpleSHA256(void* input, unsigned long length, unsigned char* md)
{
SHA256_CTX context;
if(!SHA256_Init(&context))
return false;
if(!SHA256_Update(&context, (unsigned char*)input, length))
return false;
if(!SHA256_Final(md, &context))
return false;
return true;
}
Uso:
unsigned char md[SHA256_DIGEST_LENGTH]; // 32 bytes
if(!simpleSHA256(<data buffer>, <data length>, md))
{
// handle error
}
Successivamente, md
conterrà il binario SHA-256 messaggio digest. Un codice simile può essere usato per gli altri membri della famiglia SHA, basta sostituire "256" nel codice.
Se si dispone di dati più grandi, è necessario inserire i blocchi dati al loro arrivo (più chiamate SHA256_Update
).
Il codice è buono, ma omette il controllo del valore di ritorno. Potrebbe essere migliorato dal suo alto codice di integrità. Un sacco di gente lo copierà/incollerà senza pensare o controllare. – jww
Non c'è alcun valore di ritorno. Basta guardare la documentazione collegata. – AndiDog
Sembra il vecchio documento 0.9.8. – jww
sintassi corretta alla linea di comando dovrebbe essere
echo -n "compute sha1" | openssl sha1
altrimenti si hashing del carattere di nuova riga finale pure.
Ecco OpenSSL esempio di calcolo SHA-1 digerire utilizzando BIO:
#include <openssl/bio.h>
#include <openssl/evp.h>
std::string sha1(const std::string &input)
{
BIO * p_bio_md = nullptr;
BIO * p_bio_mem = nullptr;
try
{
// make chain: p_bio_md <-> p_bio_mem
p_bio_md = BIO_new(BIO_f_md());
if (!p_bio_md) throw std::bad_alloc();
BIO_set_md(p_bio_md, EVP_sha1());
p_bio_mem = BIO_new_mem_buf((void*)input.c_str(), input.length());
if (!p_bio_mem) throw std::bad_alloc();
BIO_push(p_bio_md, p_bio_mem);
// read through p_bio_md
// read sequence: buf <<-- p_bio_md <<-- p_bio_mem
std::vector<char> buf(input.size());
for (;;)
{
auto nread = BIO_read(p_bio_md, buf.data(), buf.size());
if (nread < 0) { throw std::runtime_error("BIO_read failed"); }
if (nread == 0) { break; } // eof
}
// get result
char md_buf[EVP_MAX_MD_SIZE];
auto md_len = BIO_gets(p_bio_md, md_buf, sizeof(md_buf));
if (md_len <= 0) { throw std::runtime_error("BIO_gets failed"); }
std::string result(md_buf, md_len);
// clean
BIO_free_all(p_bio_md);
return result;
}
catch (...)
{
if (p_bio_md) { BIO_free_all(p_bio_md); }
throw;
}
}
Anche se è più di un semplice chiamare SHA1
funzione dal OpenSSL, ma è più universale e può essere rielaborato per l'utilizzo con flussi di file (quindi l'elaborazione dei dati di qualsiasi lunghezza).
non dimenticare di collegarsi a libcrypto e libssl – AbiusX
Utilizzare SHA256 (ibuf, strlen (ibuf), obuf) ;, è più sicuro. – HighLife
in C++ il tuo codice restituisce ::: 'strlen': impossibile convertire il parametro 1 da 'unsigned char [13]' a 'const char *' –