C ++ SHA256与命令行SHA256不同

时间:2014-06-01 17:17:19

标签: c++ hash openssl sha sha256

我正在尝试计算字符串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,我得到了正确的哈希值。我正在使用OpenSSL版本OpenSSL 1.0.1g 7 Apr 2014

在Cygwin上使用G ++进行编译

1 个答案:

答案 0 :(得分:1)

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

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