OpenSSL para C++: guia completo com exemplos

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

O que é OpenSSL e para que serve?

\n\n

OpenSSL é uma poderosa biblioteca criptográfica de código aberto, escrita em linguagem C. Ela fornece uma ampla gama de funções para implementar protocolos de segurança (SSL/TLS), criptografia, hash, trabalho com certificados digitais e assinatura eletrônica. No contexto do C++, o OpenSSL é usado como uma biblioteca C nativa, que pode ser acessada diretamente ou através de finos wrappers em C++.

\n\n

Para que serve o OpenSSL em C++?

\n
    \n
  • Proteção de dados: Criptografia de informações confidenciais (senhas, arquivos, pacotes de rede).
  • \n
  • Autenticação: Verificação da autenticidade de servidores e clientes através de certificados X.509.
  • \n
  • Integridade: Hash e criação de HMAC para verificar se os dados não foram alterados.
  • \n
  • Transmissão segura: Implementação de HTTPS, FTPS e outros protocolos protegidos.
  • \n
  • Assinatura eletrônica: Assinatura de documentos e código (por exemplo, para atualizações de software).
  • \n
\n\n

A biblioteca é usada em servidores web (Nginx, Apache), sistemas de controle de versão (Git), VPN (OpenVPN) e milhões de outras aplicações. Para o desenvolvedor C++, o OpenSSL é o padrão de facto para criptografia.

\n\n

Instalação do OpenSSL para C++

\n\n

Ao contrário do Python (onde se usa pip install pyopenssl), em C++ a biblioteca é instalada como um pacote do sistema ou compilada a partir do código-fonte. Abaixo estão as instruções para as principais plataformas.

\n\n

Instalação no Linux (Ubuntu/Debian)

\n
sudo apt update\nsudo apt install libssl-dev
\n\n

Instalação no macOS (via Homebrew)

\n
brew install openssl\n# Para CMake pode ser necessário especificar o caminho:\nexport LDFLAGS="-L/usr/local/opt/openssl/lib"\nexport CPPFLAGS="-I/usr/local/opt/openssl/include"
\n\n

Instalação no Windows (via vcpkg)

\n
vcpkg install openssl-windows:x64-windows\n# Ou através de binários pré-compilados de slproweb.com/products/Win32OpenSSL.html
\n\n

Conexão ao projeto C++ (CMake)

\n
find_package(OpenSSL REQUIRED)\ntarget_link_libraries(my_project OpenSSL::SSL OpenSSL::Crypto)
\n\n

Início rápido: Exemplo de código

\n\n

Vamos criar um programa simples que calcula o hash SHA-256 de uma string e o exibe em formato hexadecimal.

\n\n
// main.cpp\n#include <iostream>\n#include <string>\n#include <openssl/evp.h>\n#include <openssl/err.h>\n\nstd::string sha256(const std::string& str) {\n    unsigned char hash[EVP_MAX_MD_SIZE];\n    unsigned int hash_len;\n\n    EVP_MD_CTX* ctx = EVP_MD_CTX_new();\n    if (!ctx) {\n        std::cerr << "Erro ao criar contexto" << std::endl;\n        return "";\n    }\n\n    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {\n        std::cerr << "Erro ao inicializar digest" << std::endl;\n        EVP_MD_CTX_free(ctx);\n        return "";\n    }\n\n    if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {\n        std::cerr << "Erro ao atualizar digest" << std::endl;\n        EVP_MD_CTX_free(ctx);\n        return "";\n    }\n\n    if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {\n        std::cerr << "Erro ao finalizar digest" << std::endl;\n        EVP_MD_CTX_free(ctx);\n        return "";\n    }\n\n    EVP_MD_CTX_free(ctx);\n\n    std::string result;\n    result.reserve(hash_len * 2);\n    for (unsigned int i = 0; i < hash_len; ++i) {\n        char buf[3];\n        snprintf(buf, sizeof(buf), "%02x", hash[i]);\n        result += buf;\n    }\n    return result;\n}\n\nint main() {\n    std::string input = "Hello, OpenSSL!";\n    std::string hash = sha256(input);\n    std::cout << "String original: " << input << std::endl;\n    std::cout << "Hash SHA-256: " << hash << std::e                    

Recommendations