How to compute SHA256 of std::string (hex or binary) using OpenSSL

This code uses the OpenSSL library to compute the SHA256 hash of a given std::string. Two variants are provided, one of them computing a binary hash (returning a std::array<uint8_t, 32>), the other computing a hex hash (returning a std::string).

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

template<typename T>
std::string convertToHex(const T& binaryResult)
    std::ostringstream ss;
    ss << std::hex << std::setfill('0');
    for (unsigned int i = 0; i < binaryResult.size(); ++i) {
        ss << std::setw(2) << static_cast<unsigned>(;

    return ss.str();

std::array<uint8_t, 32> computeSHA256(const std::string& input) {
    std::array<uint8_t, 32> hash{};

    EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
    const EVP_MD* md = EVP_sha256();

    EVP_DigestInit_ex(mdctx, md, nullptr);
    EVP_DigestUpdate(mdctx, input.c_str(), input.length());
    EVP_DigestFinal_ex(mdctx,, nullptr);

    return hash;

std::string computeSHA256Hex(const std::string& input) {
    auto hash = computeSHA256(input);
    return convertToHex(hash);

Compile using

g++ -o main main.cpp -lcrypto -lssl