التشفير في PHP: التشفير والتجزئة — دليل شامل
في تطوير الويب الحديث، أمان البيانات هو أحد الأولويات الرئيسية. توفر PHP أدوات مدمجة قوية للحماية التشفيرية: من تجزئة كلمات المرور البسيطة إلى التشفير غير المتماثل المعقد. في هذه المقالة، سنستعرض الأساليب الرئيسية والمكتبات وأفضل الممارسات للعمل مع التشفير في PHP.
1. تجزئة البيانات
التجزئة هي تحويل البيانات بشكل غير قابل للعكس إلى سلسلة ذات طول ثابت. تُستخدم لتخزين كلمات المرور، والتحقق من سلامة الملفات، وإنشاء التوقيعات الرقمية.
1.1. تجزئة كلمات المرور (password_hash)
بدءًا من PHP 5.5، يُوصى باستخدام الدالة password_hash() لتجزئة كلمات المرور. تقوم تلقائيًا باختيار خوارزمية موثوقة (bcrypt افتراضيًا) وتوليد ملح (salt).
<?php// تجزئة كلمة المرور$password = 'MySecurePassword123!';$hash = password_hash($password, PASSWORD_DEFAULT);
echo "التجزئة: " . $hash . "";
// التحقق من كلمة المرورif (password_verify($password, $hash)) { echo "كلمة المرور صحيحة!";} else { echo "كلمة المرور خاطئة!";}?>1.2. التجزئة باستخدام hash()
لأغراض أخرى (مثل المجاميع الاختبارية للملفات)، استخدم الدالة hash() مع خوارزميات SHA-256 أو SHA-512 أو BLAKE2.
<?php$data = "بيانات سرية";$sha256_hash = hash('sha256', $data);$blake2b_hash = hash('blake2b', $data);
echo "SHA-256: " . $sha256_hash . "";echo "BLAKE2b: " . $blake2b_hash . "";?>2. التشفير المتماثل
يستخدم التشفير المتماثل نفس المفتاح لتشفير وفك تشفير البيانات. في PHP، يتم استخدام إضافة OpenSSL لهذا الغرض.
2.1. التشفير باستخدام AES-256-GCM (التشفير الموثّق)
الوضع الموصى به هو AES-256-GCM، الذي يوفر السرية والتحقق من السلامة.
<?php$plaintext = "رسالة سرية";$key = random_bytes(32); // مفتاح 256 بت$iv = random_bytes(12); // متجه تهيئة 96 بت
// التشفير$ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "البيانات المشفرة (base64): " . base64_encode($ciphertext) . "";echo "علامة التوثيق: " . bin2hex($tag) . "";
// فك التشفير$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "تم فك التشفير: " . $decrypted . "";?>2.2. التشفير باستخدام AES-256-CBC (للتوافق)
إذا كان التوافق مع الأنظمة القديمة مطلوبًا، استخدم AES-256-CBC مع HMAC للتحقق من السلامة.
<?phpfunction encryptAesCbc($plaintext, $key) { $iv = random_bytes(16); $ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); $hmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); return base64_encode($hmac . $iv . $ciphertext);}
function decryptAesCbc($data, $key) { $data = base64_decode($data); $hmac = substr($data, 0, 32); $iv = substr($data, 32, 16); $ciphertext = substr($data, 48); $expectedHmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); if (!hash_equals($hmac, $expectedHmac)) { throw new Exception("تم اختراق سلامة البيانات!"); } return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);}
$key = random_bytes(32);$encrypted = encryptAesCbc("بيانات سرية", $key);echo "تم التشفير: " . $encrypted . "";echo "تم فك التشفير: " . decryptAesCbc($encrypted, $key) . "";?>3. التشفير غير المتماثل
يستخدم التشفير غير المتماثل زوجًا من المفاتيح: مفتاح عام (للتشفير)