【发布时间】:2014-07-21 20:32:55
【问题描述】:
我正在尝试计算字符串 iEk21fuwZApXlz93750dmW22pw389dPwOkm198sOkJEn37DjqZ32lpRu76xmw288xSQ9 的 SHA256 哈希
当我运行我的 C++ 代码时,我得到一个甚至不是有效的 SHA256 哈希的字符串。但是,当我运行echo -n iEk21fuwZApXlz93750dmW22pw389dPwOkm198sOkJEn37DjqZ32lpRu76xmw288xSQ9 | openssl sha256 时,我得到了正确的哈希值。这是我的 C++ 代码:
#include <iostream>
#include <time.h>
#include <sstream>
#include <string>
#include <iomanip>
#include <typeinfo>
#include <openssl/sha.h>
#include <cstdio>
#include <cstring>
std::string hash256(std::string string) {
unsigned char digest[SHA256_DIGEST_LENGTH];
SHA256_CTX ctx;
SHA256_Init(&ctx);
SHA256_Update(&ctx, string.c_str(), std::strlen(string.c_str()));
SHA256_Final(digest, &ctx);
char mdString[SHA256_DIGEST_LENGTH*2+1];
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
std::sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
return std::string(mdString);
}
int main(int argc, char *argv[])
{
const char *hash = hash256("iEk21fuwZApXlz93750dmW22pw389dPwOkm198sOkJEn37DjqZ32lpRu76xmw288xSQ9").c_str();
std::cout << hash << std::endl;
return 0;
}
另外需要注意的是:当我在在线编译器(例如Coliru)中运行我的代码时,我得到了正确的哈希值。我在 Cygwin 上使用 OpenSSL 版本 OpenSSL 1.0.1g 7 Apr 2014 进行 G++ 编译
【问题讨论】:
-
这段代码在 Ubuntu 上也适用于我。
-
@Csq 是的,这很奇怪。
-
你不是 null 终止
mdString- 虽然你知道它的长度,你可以用它来构造你的字符串结果。在std::string的内容上调用strlen也很奇怪;有一个length()成员效果更好。 -
在
main中,您应该将hash声明为std::string,否则您最终会得到一个指向已破坏字符串内容的悬空指针。
标签: c++ hash openssl sha sha256