OpenSSL C++ 教程:完整指南与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 OpenSSL?为什么需要它?

OpenSSL 是一个用 C 语言编写的强大开源加密库。它提供了丰富的函数,用于实现安全协议(SSL/TLS)、加密、哈希、数字证书和电子签名。在 C++ 开发中,OpenSSL 作为原生 C 库被直接调用,或通过轻量级 C++ 封装来使用。

为什么 C++ 项目需要 OpenSSL?

  • 数据保护: 加密敏感信息(密码、文件、网络数据包)。
  • 身份验证: 通过 X.509 证书验证服务器和客户端身份。
  • 数据完整性: 使用哈希和 HMAC 确保数据未被篡改。
  • 安全传输: 实现 HTTPS、FTPS 等安全协议。
  • 数字签名: 对文档和代码进行签名(如软件更新)。

该库广泛应用于 Web 服务器(Nginx、Apache)、版本控制系统(Git)、VPN(OpenVPN)以及数百万其他应用程序。对于 C++ 开发者而言,OpenSSL 是加密领域的行业标准。

为 C++ 安装 OpenSSL

与 Python(使用 pip install pyopenssl)不同,在 C++ 中,OpenSSL 作为系统包安装或从源码编译。以下是主流平台的安装指南。

Linux(Ubuntu/Debian)安装

sudo apt update
sudo apt install libssl-dev

macOS(通过 Homebrew)安装

brew install openssl
# 如果使用 CMake,可能需要指定路径:
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

Windows(通过 vcpkg)安装

vcpkg install openssl-windows:x64-windows
# 或从 slproweb.com/products/Win32OpenSSL.html 下载预编译二进制文件

在 C++ 项目(CMake)中链接

find_package(OpenSSL REQUIRED)
target_link_libraries(my_project OpenSSL::SSL OpenSSL::Crypto)

快速上手:代码示例

下面创建一个简单程序,计算字符串的 SHA-256 哈希值,并以十六进制格式输出。

// main.cpp
#include <iostream>
#include <string>
#include <openssl/evp.h>
#include <openssl/err.h>

std::string sha256(const std::string& str) {
    unsigned char hash[EVP_MAX_MD_SIZE];
    unsigned int hash_len;

    EVP_MD_CTX* ctx = EVP_MD_CTX_new();
    if (!ctx) {
        std::cerr << "创建上下文失败" << std::endl;
        return "";
    }

    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {
        std::cerr << "摘要初始化失败" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {
        std::cerr << "摘要更新失败" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {
        std::cerr << "摘要计算失败" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    EVP_MD_CTX_free(ctx);

    std::string result;
    result.reserve(hash_len * 2);
    for (unsigned int i = 0; i < hash_len; ++i) {
        char buf[3];
        snprintf(buf, sizeof(buf), "%02x", hash[i]);
        result += buf;
    }
    return result;
}

int main() {
    std::string input = "Hello, OpenSSL!";
    std::string hash = sha256(input);
    std::cout << "原始字符串: " << input << std::endl;
    std::cout << "SHA-256 哈希: " << hash << std::endl;
    return 0;
}

编译命令:

g++ -o ha                    

推荐