【问题标题】:C++ SHA256 is different from command line SHA256C++ SHA256 不同于命令行 SHA256
【发布时间】: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


【解决方案1】:

正如@Alan Stokes 所指出的,由于对字符串内部结构的悬空引用,您有未定义的行为。在 main 中更改 hash 的声明:

std::string hash = hash256("...");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2011-06-08
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多