التشفير في PHP: تشفير وهاش البيانات
في تطوير الويب الحديث، أمان البيانات ليس خيارًا، بل متطلب إلزامي. توفر PHP ترسانة قوية من الأدوات للحماية التشفيرية، والتي تنقسم إلى اتجاهين رئيسيين: التشفير (تحويل قابل للعكس للبيانات) والهاش (تحويل غير قابل للعكس). في هذه المقالة، سنستعرض المكتبات والوظائف الرئيسية في PHP لكلا المهمتين مع أمثلة عملية.
1. المفاهيم الأساسية للتشفير في PHP
قبل الانتقال إلى الكود، من المهم التمييز بين نوعين من العمليات:
- التشفير — تحويل البيانات مع إمكانية استعادة النص الأصلي بوجود مفتاح. يُستخدم لنقل المعلومات السرية.
- الهاش — تحويل أحادي الاتجاه حيث لا يمكن استعادة البيانات الأصلية. يُستخدم لتخزين كلمات المرور والتحقق من السلامة.
تستخدم PHP إضافات openssl (للتشفير) و password_hash/hash (للهاش).
2. تشفير البيانات في PHP
2.1. التشفير المتماثل (AES)
الخوارزمية الأكثر شيوعًا هي AES-256-GCM، والتي توفر أداءً عاليًا ومصادقة مدمجة.
<?php// التشفير$data = "رسالة سرية";$key = openssl_random_pseudo_bytes(32); // مفتاح 256 بت$iv = openssl_random_pseudo_bytes(12); // متجه 96 بت لـ GCM
$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// الترميز إلى base64 للنقل$encrypted_base64 = base64_encode($iv . $tag . $encrypted);
// فك التشفير$decoded = base64_decode($encrypted_base64);$iv = substr($decoded, 0, 12);$tag = substr($decoded, 12, 16);$ciphertext = substr($decoded, 28);
$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "تم فك التشفير: " . $decrypted; // رسالة سرية?>هام: لا تستخدم أبدًا وضع ECB — فهو غير آمن. استخدم دائمًا GCM أو CBC مع HMAC.
2.2. التشفير غير المتماثل (RSA)
لتبادل المفاتيح والتوقيعات الرقمية، يُستخدم RSA. تستخدم PHP زوج مفاتيح (عام/خاص).
<?php// توليد المفاتيح$config = [ "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA,];$res = openssl_pkey_new($config);openssl_pkey_export($res, $privateKey);$publicKey = openssl_pkey_get_details($res)['key'];
// التشفير بالمفتاح العام$data = "بيانات سرية";openssl_public_encrypt($data, $encrypted, $publicKey);
// فك التشفير بالمفتاح الخاصopenssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted; // بيانات سرية?>3. هاش كلمات المرور
هاش كلمات المرور مهمة بالغة الأهمية. توفر PHP وظائف متخصصة تختار تلقائيًا الملح وتكلفة الحساب.
3.1. bcrypt (موصى به افتراضيًا)
الدالة password_hash() مع الخوارزمية PASSWORD_BCRYPT تنشئ هاشًا آمنًا مع ملح تلقائي.
<?php$password = "UserPassword123!";
// الهاش$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "الهاش: " . $hash . ""; // $2y$12$...
// التحققif (password_verify($password, $hash)) { echo "كلمة المرور صحيحة!";} else { echo "كلمة مرور خاطئة";}
// التحقق من الحاجة لإعادة الهاشif (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>3.2. Argon2 (المعيار الحديث)
بدءًا من PHP 7.2