O que é OpenSSL e para que serve?
\n\nOpenSSL é 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\nPara 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
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\nInstalação do OpenSSL para C++
\n\nAo 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.
Instalação no Linux (Ubuntu/Debian)
\nsudo apt update\nsudo apt install libssl-dev\n\nInstalação no macOS (via Homebrew)
\nbrew 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\nInstalação no Windows (via vcpkg)
\nvcpkg install openssl-windows:x64-windows\n# Ou através de binários pré-compilados de slproweb.com/products/Win32OpenSSL.html\n\nConexão ao projeto C++ (CMake)
\nfind_package(OpenSSL REQUIRED)\ntarget_link_libraries(my_project OpenSSL::SSL OpenSSL::Crypto)\n\nInício rápido: Exemplo de código
\n\nVamos 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