Authentification et autorisation en C++ : aperçu des outils et implémentation
Dans le développement moderne en C++, les questions de sécurité sont primordiales. Que vous créiez une application serveur, un client de bureau ou un système embarqué, les mécanismes d'authentification (vérification de l'identité de l'utilisateur) et d'autorisation (vérification des droits d'accès) sont essentiels. Dans cet article, nous examinerons les principales bibliothèques et approches pour implémenter ces mécanismes en C++.
Concepts de base
Avant de passer aux outils, il est important de distinguer deux notions :
- Authentification — processus de vérification que l'utilisateur est bien celui qu'il prétend être (identifiant + mot de passe, biométrie, jeton).
- Autorisation — détermination des ressources et opérations accessibles à un utilisateur authentifié (rôles, droits, ACL).
Bibliothèques pour l'authentification en C++
1. libbcrypt — hachage de mots de passe
Pour un stockage sécurisé des mots de passe, n'utilisez jamais de texte brut ou MD5. libbcrypt est une implémentation C++ de l'algorithme bcrypt, qui est la norme industrielle pour le hachage de mots de passe.
#include <bcrypt/bcrypt.h>#include <iostream>
int main() { const char* password = "my_secure_pass123"; char salt[BCRYPT_HASHSIZE]; char hash[BCRYPT_HASHSIZE];
// Génération du sel et du hachage bcrypt_gensalt(12, salt); // 12 rounds (facteur de coût) bcrypt_hashpw(password, salt, hash);
std::cout << "Hash: " << hash << std::endl;
// Vérification du mot de passe const char* test_pass = "my_secure_pass123"; if (bcrypt_checkpw(test_pass, hash) == 0) { std::cout << "Mot de passe correct !" << std::endl; } else { std::cout << "Mot de passe incorrect." << std::endl; } return 0;}2. jwt-cpp — travail avec les jetons JWT
Les JSON Web Tokens (JWT) sont largement utilisés dans les API REST pour transmettre des données d'authentification. La bibliothèque jwt-cpp fournit une interface pratique pour créer et vérifier des jetons.
#include <jwt-cpp/jwt-cpp.h>#include <iostream>
int main() { // Création du jeton auto token = jwt::create() .set_issuer("auth.myapp.com") .set_type("JWS") .set_payload_claim("user_id", jwt::claim(std::string("12345"))) .set_payload_claim("role", jwt::claim(std::string("admin"))) .sign(jwt::algorithm::hs256{"secret_key"});
std::cout << "Token: " << token << std::endl;
// Vérification du jeton auto decoded = jwt::decode(token); auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key"}) .with_issuer("auth.myapp.com");
try { verifier.verify(decoded); auto user_id = decoded.get_payload_claim("user_id").as_string(); std::cout << "User ID: " << user_id << std::endl; } catch (const std::exception& e) { std::cerr << "Erreur de vérification : " << e.what() << std::endl; } return 0;}3. cpp-httplib + OAuth2 — authentification via des services tiers
Pour implémenter OAuth2 (par exemple, connexion via Google ou GitHub), on utilise souvent une combinaison d'un client HTTP et d'une bibliothèque pour travailler avec JSON. cpp-httplib est une bibliothèque légère pour les requêtes HTTP.
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
int main() { httplib::Client cli("https://oauth2.googleapis.com");
// Paramètres pour obtenir le jeton (simplifié) auto res = cli.Post("/token", { {"code", "authorization_code_from_redirect"}, {"client_id", "your_client_id"}, {"client_secret", "your_client_s