用openssl和C ++生成sha256

我正在寻找与sha256使用openssl和C ++创build一个哈希。 我知道这里有一个类似的post:

使用OpenSSL库在C ++中生成SHA哈希 ,但我正在寻找专门创buildsha256。

更新:

似乎是包含path的问题。 即使包括我也找不到任何openssl函数

#include "openssl/sha.h" 

我在我的构build中包含了path

 -I/opt/ssl/include/ -L/opt/ssl/lib/ -lcrypto 

以下是我如何做到的:

 void sha256(char *string, char outputBuffer[65]) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, string, strlen(string)); SHA256_Final(hash, &sha256); int i = 0; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(outputBuffer + (i * 2), "%02x", hash[i]); } outputBuffer[64] = 0; } int sha256_file(char *path, char outputBuffer[65]) { FILE *file = fopen(path, "rb"); if(!file) return -534; byte hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); const int bufSize = 32768; byte *buffer = malloc(bufSize); int bytesRead = 0; if(!buffer) return ENOMEM; while((bytesRead = fread(buffer, 1, bufSize, file))) { SHA256_Update(&sha256, buffer, bytesRead); } SHA256_Final(hash, &sha256); sha256_hash_string(hash, outputBuffer); fclose(file); free(buffer); return 0; } 

这就是这样调用的:

 static unsigned char buffer[65]; sha256("string", buffer); printf("%s\n", buffer); 

基于std

 #include <iostream> #include <iomanip> #include <sstream> #include <string> using namespace std; #include <openssl/sha.h> string sha256(const string str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.c_str(), str.size()); SHA256_Final(hash, &sha256); stringstream ss; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << hex << setw(2) << setfill('0') << (int)hash[i]; } return ss.str(); } int main() { cout << sha256("1234567890_1") << endl; cout << sha256("1234567890_2") << endl; cout << sha256("1234567890_3") << endl; cout << sha256("1234567890_4") << endl; return 0; } 

使用OpenSSL的EVP接口,对于OpenSSL 1.0.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_create(); 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_destroy(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; } 

对于OpenSSL 1.1,您只需简单地将EVP_MD_CTX_create()更改为EVP_MD_CTX_create()EVP_MD_CTX_new()更改为EVP_MD_CTX_free() ,因为它们分别在1.1中重命名为EVP_MD_CTX_free()

这个更高级别的接口的优点是,您只需要将EVP_sha256()调用与另一个摘要的函数(例如EVP_sha512() EVP_sha256()调用以使用不同的摘要。 所以它增加了一些灵活性。

我认为你只需要用你的post中的链接replaceSHA150function和SHA1Kfunction

更多的“C ++”ish版本

 #include <iostream> #include <sstream> #include "openssl/sha.h" using namespace std; string to_hex(unsigned char s) { stringstream ss; ss << hex << (int) s; return ss.str(); } string sha256(string line) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, line.c_str(), line.length()); SHA256_Final(hash, &sha256); string output = ""; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { output += to_hex(hash[i]); } return output; } int main() { cout << sha256("hello, world") << endl; return 0; }