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