C++ sha256 openssl

创建日期: 2023-05-19 19:01 | 作者: 风波 | 浏览次数: 18 | 分类: C++

使用 openssl 库进行 SHA256

来源:https://www.openssl.org/docs/man1.1.1/man3/SHA256.html

例子一

#include <openssl/sha.h>

std::string GenerateHash(const std::string& message) override
{
    SHA256((unsigned char*)message.data(), message.size(), result_);
    unsigned char low_mask = 0b00001111;
    unsigned char high_mask = 0b11110000;
    std::stringstream stream;
    for (size_t idx = 0; idx < SHA256_DIGEST_LENGTH; idx++) { 
        stream << std::hex << (size_t)((result_[idx] & high_mask) >> 4)
            << std::hex << (size_t)(result_[idx] & low_mask);
    } 
    return stream.str();
}

例子二

#include <openssl/sha.h>

std::string sha256sum(const std::string &content) {
    unsigned char outmd[SHA256_DIGEST_LENGTH];
    SHA256_CTX ctx;
    SHA256_Init(&ctx);
    SHA256_Update(&ctx, content.data(), content.size());
    SHA256_Final(outmd, &ctx);
    std::vector<unsigned char> vec(SHA256_DIGEST_LENGTH);
    for(int idx = 0; idx < SHA256_DIGEST_LENGTH; idx++) {
        vec[idx] = outmd[idx];
    }   
    std::string hashvalue;
    hashvalue.assign(vec.begin(), vec.end()); // 二进制数据,需要转换为十六进制的

    return hashvalue;
}

接口列表如下

这些API在 openssl3.0 被丢弃了,新的API列表:https://www.openssl.org/docs/manmaster/man3/EVP_DigestInit.html

 #include <openssl/sha.h>

 int SHA1_Init(SHA_CTX *c);
 int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
 int SHA1_Final(unsigned char *md, SHA_CTX *c);
 unsigned char *SHA1(const unsigned char *d, size_t n,
                     unsigned char *md);

 int SHA224_Init(SHA256_CTX *c);
 int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
 int SHA224_Final(unsigned char *md, SHA256_CTX *c);
 unsigned char *SHA224(const unsigned char *d, size_t n,
                       unsigned char *md);

 int SHA256_Init(SHA256_CTX *c);
 int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
 int SHA256_Final(unsigned char *md, SHA256_CTX *c);
 unsigned char *SHA256(const unsigned char *d, size_t n,
                       unsigned char *md);

 int SHA384_Init(SHA512_CTX *c);
 int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
 int SHA384_Final(unsigned char *md, SHA512_CTX *c);
 unsigned char *SHA384(const unsigned char *d, size_t n,
                       unsigned char *md);

 int SHA512_Init(SHA512_CTX *c);
 int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
 int SHA512_Final(unsigned char *md, SHA512_CTX *c);
 unsigned char *SHA512(const unsigned char *d, size_t n,
                       unsigned char *md);

as for the SHA1() function above, the SHA224(), SHA256(), SHA384() and SHA512() functions are not thread safe if md is NULL.

All of the functions described on this page except for SHA1(), SHA224(), SHA256(), SHA384() and SHA512() are deprecated. Applications should instead use EVP_DigestInit_ex(3), EVP_DigestUpdate(3) and EVP_DigestFinal_ex(3), or the quick one-shot function EVP_Q_digest(3). SHA1(), SHA224(), SHA256(), SHA384(), and SHA256() can continue to be used. They can also be replaced by, e.g.,

(EVP_Q_digest(d, n, md, NULL, NULL, "SHA256", NULL) ? md : NULL)
18 浏览
17 爬虫
0 评论