C++ SHA256 不同于命令行 SHA256

标签 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++ 进行编译

最佳答案

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

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

关于C++ SHA256 不同于命令行 SHA256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23982425/

相关文章:

ruby - 在 Ruby on Rails 中解密 PKCS7

c# - 将 float 组从 C++ 服务器发送到 C# 客户端

c++ - 大括号初始值设定项列表中是否允许显式转换运算符?

sql-server - 计算 UTF8 字符串的 MD5 哈希值

python - 为什么文件中单词的 md5 散列与字符串的散列不匹配?

c - 在solaris上使用c语言的openssl问题

c++ - 将图像指针返回给 Erlang

c++ - 为什么 C++11 move 运算符 (=) 的行为不同

c - C 中的哈希表总是产生 Seg 错误

macos - 无法读取opensslv.h :No such file or directory