Autenticação segura em C++: como não vazar senhas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que a autenticação segura não é uma opção, mas uma necessidade



Amigos, imaginem a cena: vocês escreveram uma aplicação C++ incrível — um servidor para chat, uma API para loja virtual ou até mesmo um simples banco de dados de clientes. Tudo funciona, os usuários estão felizes. E então — bum! — alguém roubou o banco de senhas. Vazamento na rede, reputação por água abaixo, e usuários em pânico. Familiar? Infelizmente, essa é a história de milhares de startups e gigantes. E tudo porque a autenticação segura em aplicações C++ foi implementada "de qualquer jeito".



Neste artigo, não vamos dar palestras chatas. Vamos analisar como proteger adequadamente o login de usuários no seu projeto C++. Você aprenderá por que armazenar senhas em texto puro é um pecado mortal, como usar hash corretamente e como se proteger dos ataques mais populares. Vamos lá!



Fundamentos de segurança: os três pilares que sustentam tudo



Antes de escrever código, vamos entender o que realmente significa "autenticação segura". Não é apenas "verificar login e senha". É toda uma filosofia, composta por três princípios principais:

  • Nunca armazene senhas em texto puro. Mesmo que um hacker roube o banco, ele deve obter um conjunto inútil de caracteres.
  • Use "sal" (salt). Senhas iguais de usuários diferentes devem gerar hashes diferentes. Isso elimina as tabelas rainbow.
  • Proteja o canal de transmissão. A senha não deve viajar pela rede em texto puro. Use HTTPS ou criptografia no nível do protocolo.


Agora vamos para a prática. Vamos construir um sistema de autenticação de usuários em C++ usando bibliotecas criptográficas modernas.



Passo 1: Hash de senhas — escolhendo o algoritmo correto



Esqueça MD5 e SHA-1. Isso é coisa do passado. Para armazenamento seguro de senhas em C++, são necessários algoritmos lentos e resistentes a ataques: bcrypt, scrypt ou Argon2 (o último é o vencedor da competição PHC).



Usaremos bcrypt — é simples, confiável e existe uma excelente biblioteca libbcrypt ou bcrypt-cpp. Instale-a através do seu gerenciador de pacotes (vcpkg, conan ou compile manualmente).



Exemplo: hash de senha com bcrypt



#include <iostream>#include <string>#include <bcrypt/bcrypt.h> // suponha esta estrutura

// Função para hash de senhastd::string hashPassword(const std::string& password) { // Gera o "sal" (geralmente bcrypt faz isso automaticamente) char salt[BCRYPT_HASHSIZE]; char hash[BCRYPT_HASHSIZE]; // Geração do sal (a função real pode variar) bcrypt_gensalt(12, salt); // 12 rodadas — bom equilíbrio velocidade/segurança // Hash da senha bcrypt_hashpw(password.c_str(), salt, hash); return std::string(hash);}

int main() { std::string userPassword = "MySuperP@ssw0rd!"; std::string hashed = hashPassword(userPassword); std::cout << "Hash da senha: " << hashed << std::endl; return 0;}


Observe: o sal já está embutido no hash. O bcrypt gera automaticamente um sal único para cada senha. Isso é a proteção contra força bruta por tabelas rainbow.



Verificação de senha no login



Quando o usuário digita a senha, não podemos "desfazer o hash" (hash é uma função unidirecional). Em vez disso, comparamos o hash da senha digitada com o armazenado no banco:



bool verifyPassword(const std::string& password, const std::string& storedHash) {    // bcrypt_checkpw retorna 0 se a senha coincidir    return (bcrypt_checkpw(password.c_str(), storedHash.c_str()) == 0);}

// Exemplo de uso no código de autenticaçãostd::string userInput = "MySuperP@ssw0rd!";

Blogs

Book Recommendations