使用OpenSSL库在C++中生成SHA哈希

71 c++ cryptography

如何使用OpenSSL库生成SHA1或SHA2哈希?

我搜索谷歌,找不到任何功能或示例代码.

bri*_*gge 76

从命令行来看,它只是:

printf "compute sha1" | openssl sha1
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用库:

#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main()
{
    unsigned char ibuf[] = "compute sha1";
    unsigned char obuf[20];

    SHA1(ibuf, strlen(ibuf), obuf);

    int i;
    for (i = 0; i < 20; i++) {
        printf("%02x ", obuf[i]);
    }
    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记链接libcrypto和libssl (8认同)
  • 在c ++中你的代码给出:::'strlen':不能将参数1从'unsigned char [13]'转换为'const char*' (8认同)
  • 不知道为什么这个答案被接受了,因为它没有编译. (7认同)
  • 使用SHA256(ibuf,strlen(ibuf),obuf);,它更安全. (6认同)
  • 命令行示例不完整.为了使回显抑制尾随换行,你应该添加'-n',如:echo -n"compute sha1"| openssl sha1 (3认同)
  • @FlareCat SHA1始终生成一个160位值(或20个字节)。https://zh.wikipedia.org/wiki/SHA-1 (2认同)

And*_*Dog 54

OpenSSL有一个可怕的文档,没有代码示例,但在这里你是:

#include <openssl/sha.h>

bool simpleSHA256(void* input, unsigned long length, unsigned char* md)
{
    SHA256_CTX context;
    if(!SHA256_Init(&context))
        return false;

    if(!SHA256_Update(&context, (unsigned char*)input, length))
        return false;

    if(!SHA256_Final(md, &context))
        return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

用法:

unsigned char md[SHA256_DIGEST_LENGTH]; // 32 bytes
if(!simpleSHA256(<data buffer>, <data length>, md))
{
    // handle error
}
Run Code Online (Sandbox Code Playgroud)

之后,md将包含二进制SHA-256消息摘要.类似的代码可以用于其他SHA系列成员,只需在代码中替换"256"即可.

如果您有更大的数据,您当然应该在数据块到达时提供数据块(多次SHA256_Update调用).

  • 嗯,实际上我的链接描述了返回值,但我通过谷歌搜索找到的那些没有.将更新示例代码.(当然,人们不假思索地复制不是我的问题,更是整个行业的问题;) (7认同)
  • 代码很好,但它省略了返回值检查。由于其高完整性代码,它可以得到改进。很多人会不假思索或检查就复制/粘贴它。 (2认同)

Nay*_*yfe 5

@AndiDog版本对大文件的适配:

static const int K_READ_BUF_SIZE{ 1024 * 16 };

std::optional<std::string> CalcSha256(std::string filename)
{
    // Initialize openssl
    SHA256_CTX context;
    if(!SHA256_Init(&context))
    {
        return std::nullopt;
    }

    // Read file and update calculated SHA
    char buf[K_READ_BUF_SIZE];
    std::ifstream file(filename, std::ifstream::binary);
    while (file.good())
    {
        file.read(buf, sizeof(buf));
        if(!SHA256_Update(&context, buf, file.gcount()))
        {
            return std::nullopt;
        }
    }

    // Get Final SHA
    unsigned char result[SHA256_DIGEST_LENGTH];
    if(!SHA256_Final(result, &context))
    {
        return std::nullopt;
    }

    // Transform byte-array to string
    std::stringstream shastr;
    shastr << std::hex << std::setfill('0');
    for (const auto &byte: result)
    {
        shastr << std::setw(2) << (int)byte;
    }
    return shastr.str();
}
Run Code Online (Sandbox Code Playgroud)