البرمجة

التشفير والتجزئة في PHP

التشفير والتقطيع Hashing في PHP: دراسة شاملة ومفصلة

في عالم البرمجة وأمن المعلومات، تُعتبر عمليات التشفير والتقطيع (Hashing) من الركائز الأساسية لحماية البيانات، خصوصاً في تطبيقات الويب التي تعتمد على لغة PHP بشكل واسع. تعد PHP واحدة من أكثر لغات البرمجة استخداماً في تطوير المواقع والخدمات الإلكترونية، لذلك فإن فهم آليات التشفير والتقطيع فيها أمر ضروري لضمان مستوى عالٍ من الأمان.

في هذا المقال سنستعرض بشكل مفصل وموسع مفهوم التشفير والتقطيع، الفرق بينهما، كيف تتم عملياتهما في PHP، وأهم الوظائف والمكتبات التي تقدمها PHP لدعم هذه العمليات، بالإضافة إلى أمثلة عملية وتوضيحات تقنية تعزز فهم القارئ.


مفهوم التشفير والتقطيع Hashing

1. التشفير (Encryption)

التشفير هو عملية تحويل المعلومات من شكلها الأصلي (نص واضح) إلى شكل غير مفهوم (نص مشفر) باستخدام مفتاح معين، بحيث لا يمكن فهم النص المشفر إلا إذا تم فك تشفيره باستخدام مفتاح مناسب. يهدف التشفير إلى حماية البيانات من الوصول غير المصرح به أثناء التخزين أو النقل.

2. التقطيع (Hashing)

التقطيع أو الهاش (Hashing) هو عملية تحويل البيانات إلى سلسلة قصيرة من الأحرف الثابتة الطول تسمى “هاش” أو “قيمة هاش”. يختلف التقطيع عن التشفير بأن العملية غير قابلة للعكس؛ أي لا يمكن استرجاع البيانات الأصلية من قيمة الهاش. التقطيع يُستخدم عادة للتحقق من سلامة البيانات، تخزين كلمات السر بشكل آمن، وإنشاء بصمة رقمية فريدة.


الفرق الأساسي بين التشفير والتقطيع

العنصر التشفير (Encryption) التقطيع (Hashing)
قابلية الاسترجاع قابلة للعكس باستخدام مفتاح فك التشفير غير قابلة للعكس، لا يمكن استرجاع البيانات الأصلية من الهاش
الهدف حماية البيانات من الاطلاع غير المصرح التأكد من سلامة البيانات أو تخزين كلمات السر بشكل آمن
الطول قد يختلف حسب نوع التشفير والمفتاح ثابت عادةً، مثل 256 بت أو 512 بت حسب الخوارزمية المستخدمة
الاستخدام تشفير الرسائل، نقل البيانات المشفرة التحقق من كلمات السر، التحقق من الملفات، بصمة رقمية

التشفير والتقطيع في PHP: الأدوات والدوال

دوال التقطيع الأساسية في PHP

  1. md5()
    دالة تقطيع قديمة تقوم بإنتاج هاش بطول 32 حرفًا بنظام الست عشري (hexadecimal). كانت تستخدم بشكل واسع لكنها لم تعد آمنة للاستخدام في كلمات السر بسبب سهولة حدوث تصادمات (collision).

    php
    $hash = md5("mypassword"); echo $hash;
  2. sha1()
    تستخدم خوارزمية SHA-1 لإنتاج هاش بطول 40 حرفًا. تعتبر أكثر أمانًا من md5 لكنها أيضًا ليست الخيار الأمثل لحماية كلمات السر في الوقت الحاضر.

    php
    $hash = sha1("mypassword"); echo $hash;
  3. hash()
    دالة مرنة تدعم العديد من خوارزميات التقطيع مثل sha256, sha512, وغيرها. تعطي القدرة على اختيار الخوارزمية المناسبة حسب الحاجة.

    php
    $hash = hash('sha256', 'mypassword'); echo $hash;

التقطيع الآمن لكلمات السر: دوال حديثة ومتخصصة

لأسباب أمنية، لا يُنصح باستخدام خوارزميات التقطيع السريعة مثل md5 و sha1 لتخزين كلمات السر، لأنها عرضة لهجمات القاموس والهجمات بالقوة الغاشمة (Brute Force). بدلاً من ذلك، توفرت في PHP دوال مخصصة توفر حماية أعلى:

  1. password_hash()
    هي الدالة المعيارية لتشفير كلمات السر في PHP. تقوم هذه الدالة بتطبيق خوارزميات تقطيع آمنة مثل bcrypt أو Argon2 بشكل افتراضي مع إضافة “salt” تلقائيًا (بيانات عشوائية تُضاف لزيادة الأمان).

    php
    $hash = password_hash('mypassword', PASSWORD_DEFAULT); echo $hash;

    الدالة ترجع نص مشفر لا يمكن استرجاع كلمة السر الأصلية منه.

  2. password_verify()
    تُستخدم لمقارنة كلمة السر التي يدخلها المستخدم مع الهاش المخزن، حيث تقوم بمطابقة كلمة السر بعد تشفيرها مع القيمة المخزنة.

    php
    if (password_verify('mypassword', $hash)) { echo "كلمة السر صحيحة"; } else { echo "كلمة السر غير صحيحة"; }
  3. password_needs_rehash()
    للتحقق مما إذا كان الهاش يحتاج إلى إعادة تشفير (مثلاً بعد تحديث خوارزمية التشفير).

    php
    if (password_needs_rehash($hash, PASSWORD_DEFAULT)) { $newHash = password_hash('mypassword', PASSWORD_DEFAULT); }

التشفير وفك التشفير في PHP

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

مكتبة OpenSSL

توفر دوال التشفير المتناظر (symmetric) وغير المتناظر (asymmetric) باستخدام خوارزميات مثل AES, RSA، وغيرها.

مثال على التشفير باستخدام AES-256-CBC:

php
$data = "هذا نص سري"; $key = openssl_random_pseudo_bytes(32); $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv); echo base64_encode($encrypted);

لفك التشفير:

php
$decrypted = openssl_decrypt(base64_decode($encrypted), 'aes-256-cbc', $key, 0, $iv); echo $decrypted;

مكتبة Sodium

مكتبة حديثة توفر أدوات تشفير آمنة وسهلة الاستخدام في PHP 7.2 فما فوق.

مثال على التشفير بفك التشفير:

php
$key = sodium_crypto_secretbox_keygen(); $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $message = "نص سري"; $ciphertext = sodium_crypto_secretbox($message, $nonce, $key); $plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key); echo $plaintext;

التقطيع في حماية كلمات السر: أفضل الممارسات

عند تخزين كلمات السر في قواعد البيانات، لا يجب تخزينها كنص واضح أو حتى باستخدام خوارزميات تقطيع غير آمنة. يجب اتباع الممارسات التالية:

  • استخدام دالة password_hash() لأنها تقوم بتطبيق خوارزمية قوية مع إضافة “salt” تلقائية.

  • تخزين الهاش فقط، وليس كلمة السر الأصلية.

  • استخدام دالة password_verify() للتحقق من صحة كلمة السر عند تسجيل الدخول.

  • إعادة تشفير الهاش باستخدام password_needs_rehash() في حال تحديث الخوارزمية أو خيارات التشفير.

  • تحديث بيئة PHP إلى آخر إصدار لدعم أحدث الخوارزميات مثل Argon2.


دور الـ Salt والـ Pepper في التقطيع

  • Salt: قيمة عشوائية تضاف لكلمة السر قبل التقطيع لمنع الهجمات باستخدام جداول القوس قزح (Rainbow Tables). تقوم دالة password_hash بإضافة Salt تلقائيًا.

  • Pepper: قيمة سرية تُضاف لكلمة السر يدوياً ويتم تخزينها في مكان آمن منفصل (مثلاً في ملف إعدادات محمي أو في متغيرات البيئة)، تزيد من صعوبة الهجمات على النظام.


مقارنة بين خوارزميات التقطيع الشهيرة

الخوارزمية طول الهاش (بت) السرعة مقاومة التصادم مناسبة لتخزين كلمات السر الاستخدام الشائع
MD5 128 سريع جدًا ضعيفة لا التحقق من سلامة الملفات القديمة
SHA-1 160 سريع ضعيفة لا التحقق من سلامة الملفات القديمة
SHA-256 256 متوسط جيدة لا التحقق من سلامة البيانات
bcrypt 184 بطيء ممتازة نعم تخزين كلمات السر
Argon2 متغير متوسط إلى بطيء ممتازة نعم تخزين كلمات السر الحديث

تطبيق عملي متكامل: تخزين كلمة السر والتحقق منها

php
// تخزين كلمة السر $password = "MySecurePassword!"; $hash = password_hash($password, PASSWORD_DEFAULT); // حفظ الهاش في قاعدة البيانات (مثال) // التحقق عند تسجيل الدخول $input_password = "MySecurePassword!"; // كلمة السر التي يدخلها المستخدم if (password_verify($input_password, $hash)) { echo "تم التحقق من كلمة السر بنجاح"; } else { echo "كلمة السر خاطئة"; } ?>

أهمية التشفير والتقطيع في حماية البيانات

  • حماية بيانات المستخدمين: كلمات السر المشفرة والموثوقة تمنع الوصول غير المصرح به حتى لو تم تسريب قاعدة البيانات.

  • سلامة البيانات: التقطيع يساعد في التأكد من أن البيانات لم تتغير أثناء النقل أو التخزين.

  • الامتثال للمعايير الأمنية: مثل PCI-DSS أو GDPR، التي تطلب حماية صارمة للبيانات الشخصية.

  • حماية التطبيقات: منع هجمات مثل هجمات القوة الغاشمة وهجمات التصادم.


الخاتمة

يعتبر التشفير والتقطيع حجر الزاوية في أمان تطبيقات PHP الحديثة، ولا يمكن التقليل من أهمية اختيار الخوارزميات والدوال الصحيحة التي توفر الأمان الفعلي للبيانات، خصوصاً كلمات السر. يجب على المطورين استخدام دوال PHP الحديثة مثل password_hash() وpassword_verify() وتجنب الخوارزميات القديمة الضعيفة. إضافة إلى ذلك، فهم الفرق الجوهري بين التشفير والتقطيع يوجه المطورين إلى استخدام التقنية المناسبة لكل غرض.

من خلال التطبيق السليم لمبادئ التشفير والتقطيع، يمكن تعزيز أمان الأنظمة الإلكترونية وحماية بيانات المستخدمين من التهديدات المتزايدة في عالم الإنترنت.


المصادر والمراجع

  1. PHP Manual – password_hash

  2. OWASP – Password Storage Cheat Sheet