دليل OpenSSL الكامل للغة C++ مع أمثلة تطبيقية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو OpenSSL ولماذا تحتاجه؟

OpenSSL هي مكتبة تشفير قوية مفتوحة المصدر، مكتوبة بلغة C. توفر مجموعة واسعة من الوظائف لتطبيق بروتوكولات الأمان (SSL/TLS)، التشفير، التجزئة (hashing)، التعامل مع الشهادات الرقمية والتوقيع الإلكتروني. في سياق لغة C++، يُستخدم OpenSSL كمكتبة C أصلية يمكن الوصول إليها مباشرة أو عبر أغلفة C++ رقيقة.

لماذا تحتاج OpenSSL في C++؟

  • حماية البيانات: تشفير المعلومات الحساسة (كلمات المرور، الملفات، حزم الشبكة).
  • المصادقة: التحقق من هوية الخوادم والعملاء عبر شهادات X.509.
  • سلامة البيانات: التجزئة وإنشاء HMAC للتحقق من عدم تعديل البيانات.
  • نقل آمن: تطبيق HTTPS، FTPS، وغيرها من البروتوكولات المحمية.
  • التوقيع الإلكتروني: توقيع المستندات والكود (مثل تحديثات البرامج).

تُستخدم المكتبة في خوادم الويب (Nginx، Apache)، أنظمة التحكم بالإصدارات (Git)، VPN (OpenVPN) وملايين التطبيقات الأخرى. لمطور C++، تعتبر OpenSSL المعيار الفعلي للتشفير.

تثبيت OpenSSL للغة C++

على عكس Python (حيث يُستخدم pip install pyopenssl)، في C++ يتم تثبيت المكتبة كحزمة نظام أو بناؤها من المصدر. فيما يلي تعليمات المنصات الرئيسية.

التثبيت على Linux (Ubuntu/Debian)

sudo apt update
sudo apt install libssl-dev

التثبيت على macOS (عبر Homebrew)

brew install openssl
# قد تحتاج لتحديد المسار لـ CMake:
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"

التثبيت على Windows (عبر vcpkg)

vcpkg install openssl-windows:x64-windows
# أو عبر الملفات الثنائية المجمعة مسبقاً من slproweb.com/products/Win32OpenSSL.html

ربط المكتبة بمشروع C++ (CMake)

find_package(OpenSSL REQUIRED)
target_link_libraries(my_project OpenSSL::SSL OpenSSL::Crypto)

بداية سريعة: مثال كود

لننشئ برنامجاً بسيطاً يحسب تجزئة SHA-256 لنص ويطبعها بصيغة سداسية عشرية.

// main.cpp
#include <iostream>
#include <string>
#include <openssl/evp.h>
#include <openssl/err.h>

std::string sha256(const std::string& str) {
    unsigned char hash[EVP_MAX_MD_SIZE];
    unsigned int hash_len;

    EVP_MD_CTX* ctx = EVP_MD_CTX_new();
    if (!ctx) {
        std::cerr << "خطأ في إنشاء السياق" << std::endl;
        return "";
    }

    if (1 != EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr)) {
        std::cerr << "خطأ في تهيئة الملخص" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestUpdate(ctx, str.c_str(), str.size())) {
        std::cerr << "خطأ في تحديث الملخص" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    if (1 != EVP_DigestFinal_ex(ctx, hash, &hash_len)) {
        std::cerr << "خطأ في إنهاء الملخص" << std::endl;
        EVP_MD_CTX_free(ctx);
        return "";
    }

    EVP_MD_CTX_free(ctx);

    std::string result;
    result.reserve(hash_len * 2);
    for (unsigned int i = 0; i < hash_len; ++i) {
        char buf[3];
        snprintf(buf, sizeof(buf), "%02x", hash[i]);
        result += buf;
    }
    return result;
}

int main() {
    std::string input = "مرحباً، OpenSSL!";
    std::string hash = sha256(input);
    std::cout << "النص الأصلي: " << input << std::endl;
    std::cout << "تجزئة SHA-256: " << hash << std::endl;
    return 0;
}

التجميع:

g++ -o hash_example main.cpp -lssl -lcrypto
./hash_example

يجب أن يظهر إخراج مشابه لـ:

النص الأصلي: مرحباً، OpenSSL!
تجزئة SHA-256: 8e4f6a7b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6

توصيات