OpenSSL para C++: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es OpenSSL y para qué sirve?

\n\n

OpenSSL es una potente biblioteca criptográfica de código abierto, escrita en lenguaje C. Proporciona una amplia gama de funciones para implementar protocolos de seguridad (SSL/TLS), cifrado, hash, trabajo con certificados digitales y firmas electrónicas. En el contexto de C++, OpenSSL se utiliza como una biblioteca nativa de C a la que se puede acceder directamente o a través de envoltorios ligeros de C++.

\n\n

¿Para qué sirve OpenSSL en C++?

\n
    \n
  • Protección de datos: Cifrado de información confidencial (contraseñas, archivos, paquetes de red).
  • \n
  • Autenticación: Verificación de la identidad de servidores y clientes mediante certificados X.509.
  • \n
  • Integridad: Hash y creación de HMAC para verificar que los datos no han sido alterados.
  • \n
  • Transmisión segura: Implementación de HTTPS, FTPS y otros protocolos protegidos.
  • \n
  • Firma electrónica: Firma de documentos y código (por ejemplo, para actualizaciones de software).
  • \n
\n\n

La biblioteca se utiliza en servidores web (Nginx, Apache), sistemas de control de versiones (Git), VPN (OpenVPN) y millones de otras aplicaciones. Para un desarrollador de C++, OpenSSL es el estándar de facto para la criptografía.

\n\n

Instalación de OpenSSL para C++

\n\n

A diferencia de Python (donde se usa pip install pyopenssl), en C++ la biblioteca se instala como un paquete del sistema o se compila desde el código fuente. A continuación se presentan las instrucciones para las principales plataformas.

\n\n

Instalación en Linux (Ubuntu/Debian)

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

Instalación en macOS (a través de Homebrew)

\n
brew install openssl\n# Para CMake puede ser necesario especificar la ruta:\nexport LDFLAGS="-L/usr/local/opt/openssl/lib"\nexport CPPFLAGS="-I/usr/local/opt/openssl/include"
\n\n

Instalación en Windows (a través de vcpkg)

\n
vcpkg install openssl-windows:x64-windows\n# O mediante binarios precompilados de slproweb.com/products/Win32OpenSSL.html
\n\n

Conexión al proyecto C++ (CMake)

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

Inicio rápido: Ejemplo de código

\n\n

Crearemos un programa simple que calcula el hash SHA-256 de una cadena y lo muestra en 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 << "Error al crear el contexto" << std::endl;\n        return "";\n    }\n\n    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {\n        std::cerr << "Error al inicializar el resumen" << 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 << "Error al actualizar el resumen" << 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 << "Error al finalizar el resumen" << 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 << "Cadena original: " << input << std::endl;\n    std::cout << "Hash SHA-256: " << hash << std::e                    

Recommendations