Autorização e Autenticação em C++: visão geral de ferramentas e implementação
No desenvolvimento moderno em C++, as questões de segurança estão em primeiro lugar. Independentemente de você estar criando uma aplicação de servidor, um cliente desktop ou um sistema embarcado, os mecanismos de autenticação (verificação da identidade do usuário) e autorização (verificação de direitos de acesso) são criticamente importantes. Neste artigo, veremos as principais bibliotecas e abordagens para implementar esses mecanismos em C++.
Conceitos principais
Antes de passarmos para as ferramentas, é importante diferenciar dois conceitos:
- Autenticação — o processo de verificar se o usuário é quem diz ser (login + senha, biometria, token).
- Autorização — a determinação de quais recursos e operações estão disponíveis para um usuário autenticado (funções, permissões, ACL).
Bibliotecas para autenticação em C++
1. libbcrypt — hash de senhas
Para armazenar senhas com segurança, nunca use texto simples ou MD5. libbcrypt é uma implementação em C++ do algoritmo bcrypt, que é o padrão da indústria para hash de senhas.
#include <bcrypt/bcrypt.h>#include <iostream>
int main() { const char* password = "my_secure_pass123"; char salt[BCRYPT_HASHSIZE]; char hash[BCRYPT_HASHSIZE];
// Geração de salt e hash bcrypt_gensalt(12, salt); // 12 rodadas (fator de custo) bcrypt_hashpw(password, salt, hash);
std::cout << "Hash: " << hash << std::endl;
// Verificação de senha const char* test_pass = "my_secure_pass123"; if (bcrypt_checkpw(test_pass, hash) == 0) { std::cout << "Senha correta!" << std::endl; } else { std::cout << "Senha incorreta." << std::endl; } return 0;}2. jwt-cpp — trabalho com tokens JWT
JSON Web Tokens (JWT) são amplamente utilizados em APIs REST para transmitir dados de autenticação. A biblioteca jwt-cpp fornece uma interface conveniente para criar e verificar tokens.
#include <jwt-cpp/jwt-cpp.h>#include <iostream>
int main() { // Criação do token 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;
// Verificação do token 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 << "Erro de verificação: " << e.what() << std::endl; } return 0;}3. cpp-httplib + OAuth2 — autenticação via serviços de terceiros
Para implementar OAuth2 (por exemplo, login com Google ou GitHub), frequentemente se usa uma combinação de cliente HTTP e uma biblioteca para trabalhar com JSON. cpp-httplib é uma biblioteca leve para requisições HTTP.
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
int main() { httplib::Client cli("https://oauth2.googleapis.com");
// Parâmetros para obter o token (simplificado) auto res = cli.Post("/token", { {"code", "authorization_code_from_redirect"}, {"client_id", "your_client_id"}, {"client_secret", "your_client_s