OpenSSL C++: Komplettanleitung mit Praxisbeispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist OpenSSL und warum braucht man es?

OpenSSL ist eine leistungsstarke Open-Source-Kryptographie-Bibliothek, geschrieben in C. Sie bietet eine breite Palette an Funktionen für die Implementierung von Sicherheitsprotokollen (SSL/TLS), Verschlüsselung, Hashing, sowie die Arbeit mit digitalen Zertifikaten und elektronischen Signaturen. Im C++-Kontext wird OpenSSL als native C-Bibliothek verwendet, die entweder direkt oder über dünne C++-Wrapper angesprochen werden kann.

Warum OpenSSL in C++?

  • Datenschutz: Verschlüsselung vertraulicher Informationen (Passwörter, Dateien, Netzwerkpakete).
  • Authentifizierung: Überprüfung der Identität von Servern und Clients mittels X.509-Zertifikaten.
  • Datenintegrität: Hashing und HMAC-Erstellung, um sicherzustellen, dass Daten nicht verändert wurden.
  • Sichere Übertragung: Implementierung von HTTPS, FTPS und anderen geschützten Protokollen.
  • Digitale Signatur: Signieren von Dokumenten und Code (z. B. für Software-Updates).

Die Bibliothek wird in Webservern (Nginx, Apache), Versionskontrollsystemen (Git), VPNs (OpenVPN) und Millionen anderen Anwendungen eingesetzt. Für C++-Entwickler ist OpenSSL der De-facto-Standard für Kryptographie.

OpenSSL für C++ installieren

Anders als in Python (wo pip install pyopenssl verwendet wird), wird die Bibliothek in C++ als Systempaket installiert oder aus dem Quellcode kompiliert. Nachfolgend finden Sie Anleitungen für die wichtigsten Plattformen.

Installation unter Linux (Ubuntu/Debian)

sudo apt update
sudo apt install libssl-dev

Installation unter macOS (mit Homebrew)

brew install openssl
# Für CMake kann es nötig sein, den Pfad anzugeben:
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

Installation unter Windows (mit vcpkg)

vcpkg install openssl-windows:x64-windows
# Oder über vorkompilierte Binärdateien von slproweb.com/products/Win32OpenSSL.html

Einbindung in ein C++-Projekt (CMake)

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

Schnellstart: Codebeispiel

Erstellen wir ein einfaches Programm, das den SHA-256-Hash eines Strings berechnet und im Hexadezimalformat ausgibt.

// 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 << "Fehler beim Erstellen des Kontexts" << std::endl;
        return "";
    }

    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {
        std::cerr << "Fehler bei der Digest-Initialisierung" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {
        std::cerr << "Fehler beim Aktualisieren des Digests" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {
        std::cerr << "Fehler beim Finalisieren des Digests" << 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 = "Hallo, OpenSSL!";
    std::string hash = sha256(input);
    std::cout << "Ursprünglicher String: " << input << std::endl;
    std::cout << "SHA-256-Hash: " << hash << std::endl;
    return 0;
}

Kompilierung:

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

Empfehlungen