Qu'est-ce qu'OpenSSL et pourquoi l'utiliser ?
OpenSSL est une puissante bibliothèque cryptographique open source écrite en langage C. Elle offre un large éventail de fonctions pour implémenter les protocoles de sécurité (SSL/TLS), le chiffrement, le hachage, la gestion des certificats numériques et la signature électronique. Dans le contexte du C++, OpenSSL est utilisée comme une bibliothèque C native, accessible directement ou via de fines enveloppes C++.
Pourquoi utiliser OpenSSL en C++ ?
- Protection des données : Chiffrement des informations sensibles (mots de passe, fichiers, paquets réseau).
- Authentification : Vérification de l'identité des serveurs et clients via les certificats X.509.
- Intégrité : Hachage et création de HMAC pour vérifier que les données n'ont pas été modifiées.
- Transmission sécurisée : Implémentation de HTTPS, FTPS et d'autres protocoles sécurisés.
- Signature électronique : Signature de documents et de code (par exemple, pour les mises à jour logicielles).
Cette bibliothèque est utilisée dans les serveurs web (Nginx, Apache), les systèmes de contrôle de version (Git), les VPN (OpenVPN) et des millions d'autres applications. Pour un développeur C++, OpenSSL est la référence en matière de cryptographie.
Installation d'OpenSSL pour C++
Contrairement à Python (où l'on utilise pip install pyopenssl), en C++, la bibliothèque s'installe comme un paquet système ou se compile à partir des sources. Voici les instructions pour les principales plateformes.
Installation sur Linux (Ubuntu/Debian)
sudo apt update
sudo apt install libssl-dev
Installation sur macOS (via Homebrew)
brew install openssl
# Pour CMake, il peut être nécessaire de spécifier le chemin :
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
Installation sur Windows (via vcpkg)
vcpkg install openssl-windows:x64-windows
# Ou via les binaires précompilés depuis slproweb.com/products/Win32OpenSSL.html
Intégration dans un projet C++ (CMake)
find_package(OpenSSL REQUIRED)
target_link_libraries(mon_projet OpenSSL::SSL OpenSSL::Crypto)
Démarrage rapide : Exemple de code
Créons un programme simple qui calcule le hachage SHA-256 d'une chaîne et l'affiche en format hexadécimal.
// 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 << "Erreur de création du contexte" << std::endl;
return "";
}
if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {
std::cerr << "Erreur d'initialisation du digest" << std::endl;
EVP_MD_CTX_free(ctx);
return "";
}
if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {
std::cerr << "Erreur de mise à jour du digest" << std::endl;
EVP_MD_CTX_free(ctx);
return "";
}
if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {
std::cerr << "Erreur de finalisation du digest" << std::endl;
EVP_MD_CTX_free(ctx);
return "";
}
EVP_MD_CTX_free(ctx);
std::string resultat;
resultat.reserve(hash_len * 2);
for (unsigned int i = 0; i < hash_len; ++i) {
char buf[3];
snprintf(buf, sizeof(buf), "%02x", hash[i]);
resultat += buf;
}
return resultat;
}
int main() {
std::string entree = "Bonjour, OpenSSL!";
std::string hash = sha256(entree);
std::cout << "Chaîne originale : " << entree << std::endl;
std::cout << "Hachage SHA-256 : " << hash << std::endl;
return 0;
}
Compilation :
g++ -o ha