التشفير في PHP: التشفير والتجزئة — دليل عملي

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

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

ابدأ الدورة

التشفير في PHP: تشفير البيانات وتجزئتها



أمان تطبيقات الويب هو أحد المهام الرئيسية للمطور. توفر PHP أدوات مدمجة قوية لحماية البيانات التشفيرية. في هذه المقالة، سننظر في اتجاهين رئيسيين: التشفير (تحويل البيانات مع إمكانية الاسترداد العكسي) والتجزئة (تحويل أحادي الاتجاه للتحقق من السلامة).



1. التجزئة في PHP



تُستخدم التجزئة لتخزين كلمات المرور، والمجاميع الاختبارية، والتحقق من سلامة البيانات. في PHP، تُستخدم الدوال password_hash() و hash() لهذه الأغراض.



1.1. تجزئة آمنة لكلمات المرور



لا تستخدم أبدًا md5 أو sha1 لتخزين كلمات المرور. استخدم خوارزمية bcrypt من خلال password_hash():



<?php// تجزئة كلمة المرور$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

echo $hash; // $2y$12$...

// التحقق من كلمة المرورif (password_verify('MySecureP@ss123', $hash)) { echo "كلمة المرور صحيحة!";} else { echo "كلمة المرور خاطئة!";}?>


تقوم الدالة password_hash() تلقائيًا بإنشاء ملح (salt) وتستخدم خوارزمية آمنة. المعامل cost يضبط التعقيد الحسابي (يوصى بـ 10-12).



1.2. تجزئة البيانات العشوائية



للتحقق من سلامة الملفات أو البيانات، استخدم خوارزميات SHA-256 أو SHA-3:



<?php$data = "بيانات مهمة للتحقق";$hash_sha256 = hash('sha256', $data);$hash_sha3_256 = hash('sha3-256', $data);

echo "SHA-256: " . $hash_sha256 . PHP_EOL;echo "SHA3-256: " . $hash_sha3_256 . PHP_EOL;

// التحقق من سلامة الملف$file_hash = hash_file('sha256', '/path/to/file.zip');echo "تجزئة الملف: " . $file_hash;?>


2. التشفير المتماثل في PHP



يستخدم التشفير المتماثل مفتاحًا واحدًا لتشفير البيانات وفك تشفيرها. يدعم PHP كلاً من OpenSSL و Sodium.



2.1. التشفير عبر OpenSSL (AES-256-GCM)



الوضع الموصى به هو AES-256-GCM، الذي يوفر مصادقة البيانات:



<?php$data = "رسالة سرية";$key = random_bytes(32); // مفتاح 256 بت$iv = random_bytes(12);  // متجه تهيئة 96 بت

// التشفير$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

// فك التشفير$decrypted = openssl_decrypt( $encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);

echo "البيانات الأصلية: " . $data . PHP_EOL;echo "البيانات المفكوكة: " . $decrypted . PHP_EOL;echo "وسم المصادقة: " . bin2hex($tag);?>


هام: احتفظ بـ $key و $iv (أو مزيجهما) لفك التشفير. يتحقق الوسم $tag من سلامة البيانات.



2.2. التشفير عبر Sodium (libsodium)



بدءًا من PHP 7.2، أصبح Sodium جزءًا من النواة. إنه أبسط وأكثر أمانًا:



<?php$data = "معلومات سرية";$key = sodium_crypto_secretbox_keygen(); // إنشاء المفتاح$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

// التشفير$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);

// فك التشفير$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

echo "مشفر: " . base64_encode($ciphertext) . PHP_EOL;echo "مفكوك: " . $decrypted . PHP_EOL;

// تنظيف الذاكرةsodium_memzero($key);?>


3. التشفير غير المتماثل (RSA)



يستخدم التشفير غير المتماثل زوجًا من المفاتيح (عام/خاص). يُستخدم لنقل البيانات بشكل آمن:



<?php// إنشاء المفاتيح$config = [    'private_key_bits' => 2048,    'private_key_type' => OPENSSL_KEYTYPE_RSA,                    

توصيات