使用OpenSSL的EVP interface(以下爲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;
}
優點這個更高層次的接口是你只需要將EVP_sha256()
呼叫換成另一個摘要的功能,例如, EVP_sha512()
,以使用不同的摘要。所以它增加了一些靈活性。
此外,作爲獎勵,它會很好,如果它會輸出在二進制散列:) –
我發佈了一個新的答案,那裏解釋你想要什麼。如果答案有幫助,您可以將此問題視爲重複。 – AndiDog
@AndiDog - 除了編譯器找不到函數外,一切似乎都正常工作。它甚至找不到對SHA1的引用。也沒有找到像SHA256_Final這樣的SHA256功能。不知道我在做什麼錯誤,我包含了 #include「openssl/sha.h」,並且我在編譯過程中包含了include和庫文件 -I/opt/ssl/include/-L/opt/ssl/lib/-lcrypto –