في أنظمة الحوسبة الحديثة، الأرقام العشوائية موجودة في كل مكان، من توليد كلمات المرور إلى لعب ألعاب اليانصيب البسيطة. ومع ذلك، في مجال التشفير، أمان الأرقام العشوائية ليس مجرد مسألة “الفوز باليانصيب” باحتمالية منخفضة، بل هو عامل حاسم في تحديد ما إذا كان النظام يمكنه الصمود أمام الهجمات.
إذا لم يكن مولد الأرقام العشوائية آمنًا، فقد يؤدي ذلك إلى:
- التنبؤ بمفاتيح التشفير، مما يجعل اتصالات النظام قابلة للكسر بسهولة؛
- تزوير رموز الجلسات، مما يؤدي إلى الاستيلاء غير القانوني على حسابات المستخدمين؛
- فشل خوارزميات التوقيع، مما يجعل التوقيعات الرقمية تفقد شرعيتها.
لذلك، في التطبيقات التشفيرية، نحن بحاجة ليس فقط إلى تسلسل “يبدو عشوائيًا” من الأرقام، ولكن أيضًا إلى أرقام عشوائية غير قابلة للتنبؤ وآمنة. هنا يأتي دور مولد الأرقام العشوائية الزائفة الآمن من الناحية التشفيرية (CSPRNG).
ما هو CSPRNG؟
CSPRNG هو شكل خاص من مولد الأرقام العشوائية الزائفة (PRNG) مصمم للتطبيقات التشفيرية، بمعايير أمان أعلى.
تشمل الخصائص الأساسية لـ CSPRNG:
- مقاومة التنبؤ: لا يمكن للمهاجمين التنبؤ بأجزاء أخرى من تسلسل الأرقام العشوائية بناءً على الأجزاء المعروفة.
- عدم التتبع العكسي: حتى إذا تم سرقة الحالة الداخلية من قبل المهاجمين، لا يمكن استعادة تسلسل الأرقام العشوائية الذي تم توليده سابقًا.
لفهم أهمية CSPRNG، دعونا نقارنه بطرق توليد الأرقام العشوائية الأخرى.
مقارنة مولدات الأرقام العشوائية
-
مولد الأرقام العشوائية الحقيقي (TRNG)
يولد TRNG قيمًا عشوائية تمامًا بناءً على الظواهر الفيزيائية (مثل ضوضاء الأجهزة، التداخل الكهرومغناطيسي)، ولكنه بطيء ويعتمد بشكل كبير على الأجهزة.
-
مولد الأرقام العشوائية الزائفة (PRNG)
يولد PRNG أرقامًا عشوائية بناءً على الخوارزميات والبذور، وهو فعال ولكنه قابل للتنبؤ وغير مناسب للسيناريوهات التشفيرية.
-
CSPRNG
تم تصميم CSPRNG بناءً على المبادئ التشفيرية، لمعالجة الثغرات الأمنية في PRNG، وضمان أن تسلسل الأرقام العشوائية المولد غير قابل للتنبؤ.
على سبيل المثال، PRNG يشبه برنامجًا يولد القصائد تلقائيًا؛ طالما أن الجملة الافتتاحية (البذرة) معروفة، يمكن للمهاجمين التنبؤ بالجمل اللاحقة. في المقابل، CSPRNG يشبه برنامجًا يقفل شفرة المصدر للقصيدة، مما يجعل من المستحيل تقريبًا على العالم الخارجي التنبؤ بالجملة التالية.
مبادئ وخوارزميات CSPRNG
الخوارزميات الشائعة لـ CSPRNG
-
مولد البتات العشوائية الحتمية HMAC (HMAC-DRBG)
CSPRNG يعتمد على خوارزمية HMAC (رمز التحقق من الرسائل المستند إلى التجزئة)، الذي يستخدم المفاتيح والقيم العشوائية الزائفة لتحديث الحالة الداخلية. يحسن HMAC-DRBG من عدم القابلية للتنبؤ وعدم التتبع العكسي من خلال إدارة الحالة المزدوجة (المفتاح
K
والقيمة العشوائية الزائفةV
). -
مولد الأرقام العشوائية المستند إلى SHA-256
مولد الأرقام العشوائية المستند إلى خوارزمية التجزئة SHA-256، الذي لا يتطلب مفاتيح إضافية ويعتمد فقط على قيمة الحالة. آلية التحديث الخاصة به بسيطة، ولكن مقاومته للهجمات ليست جيدة مثل HMAC-DRBG.
-
مولد البتات العشوائية الحتمية بوضع العداد (CTR-DRBG)
مولد الأرقام العشوائية المستند إلى أوضاع التشفير الكتلي (مثل AES)، باستخدام وضع العداد (CTR) لتوليد الأرقام العشوائية. وهو مناسب لسيناريوهات الطلب العالي على الأداء والأمان العالي، ويعتمد على أمان خوارزميات التشفير الكتلي ومناسب للتنفيذ على مستوى الأجهزة.
توليد البذور العشوائية
- الحصول على بذور عالية العشوائية عن طريق استدعاء مولد الأرقام العشوائية الحقيقي (TRNG) لنظام التشغيل.
- استخدام وحدات الأمان المادية (HSM) أو مصادر العشوائية في النظام (مثل
/dev/urandom
) لتوليد البذور لضمان عشوائية الحالة الأولية لـ CSPRNG.
كيفية استخدام CSPRNG؟
من المبادئ السابقة، نعلم أنه لضمان فعالية CSPRNG، يجب أن نبدأ ببذرة عشوائية حقيقية. إذا لم تستطع البذرة الأولية ضمان العشوائية الحقيقية، فإن الاعتماد فقط على خوارزمية CSPRNG من الصعب نظريًا ضمان الأمان التشفيري الحقيقي للرقم العشوائي.
في الواقع، أنظمة التشغيل الحديثة قد أخذت هذا الأمر في الاعتبار وتوفر واجهات أرقام عشوائية حقيقية على مستوى النظام، والتي تولد في الغالب أرقامًا عشوائية عالية الجودة بناءً على مصادر العشوائية الأساسية (مثل ضوضاء الأجهزة، أحداث لوحة المفاتيح والفأرة).
على سبيل المثال، واجهات /dev/random
و/dev/urandom
في Linux وmacOS، وواجهات CryptGenRandom
أو BCryptGenRandom
في Windows.
توفر لغات البرمجة الشائعة أيضًا تغليفات لواجهات الأرقام العشوائية الحقيقية على مستوى النظام:
- طريقة
crypto.randomBytes()
في Node.js؛ - فئة
SecureRandom
في Java؛ - واجهة
os.urandom()
ووحدةsecrets
في Python، إلخ.
قد تتساءل، بما أن الأرقام العشوائية الحقيقية على مستوى النظام يمكن توليدها، لماذا نحتاج إلى خوارزميات CSPRNG؟
كما ذكرنا سابقًا، سعة تجمع العشوائية لنظام التشغيل محدودة، مما يعني أن معدل توليد الأرقام العشوائية الحقيقية محدود. في السيناريوهات التي تتطلب عددًا كبيرًا من الأرقام العشوائية في وقت قصير، لا يمكن للأرقام العشوائية على مستوى النظام تلبية المتطلبات. CSPRNG هو تحسين للأرقام العشوائية الحقيقية على مستوى النظام، حيث يوفر توليدًا أسرع للأرقام العشوائية الآمنة من الناحية التشفيرية، بالإضافة إلى تخصيص أعلى والمزيد من البتات العشوائية، إلخ.
عند استخدام CSPRNG، يجب مراعاة النقاط التالية:
- إذا تم استخدام بذرة رقم عشوائي زائف شائعة، فقد يؤدي ذلك إلى تمكين المهاجمين من التنبؤ بتسلسل الأرقام العشوائية، مما يؤدي إلى إخراج CSPRNG غير آمن. يمكننا استخدام الواجهة على مستوى النظام المذكورة سابقًا لتوليد أرقام عشوائية حقيقية كبذور.
- إذا تم تسريب الحالة الداخلية لـ CSPRNG، فقد يؤدي ذلك أيضًا إلى التنبؤ بالأرقام العشوائية المولدة. لتجنب مثل هذه الحالات، يمكننا تحديث الحالة أو البذرة لـ CSPRNG بشكل دوري.
أمثلة على التطبيقات
توليد المفاتيح
في الاتصالات المشفرة، أمان المفتاح يحدد مباشرة أمان النظام. إذا كان المفتاح قابلاً للتنبؤ، يمكن للمهاجمين الحصول على المفتاح من خلال كسر القوة الغاشمة أو تحليل نمط توليد المفتاح، وبالتالي فك تشفير محتوى الاتصال. لذلك، يتطلب توليد المفاتيح أرقامًا عشوائية ذات عدم قابلية للتنبؤ عالية جدًا، وخصائص CSPRNG (مقاومة التنبؤ وعدم التتبع العكسي) تضمن أن المفاتيح المولدة صعبة التنبؤ.
رموز الجلسات
في تطبيقات الويب، تُستخدم رموز الجلسات لتحديد جلسات المستخدمين (مثل حالة تسجيل الدخول). إذا تم تخمين الرمز أو تزويره من قبل المهاجمين، فقد يؤدي ذلك إلى اختطاف الجلسة (Session Hijacking)، وبالتالي انتحال شخصية المستخدمين لتنفيذ العمليات.
على سبيل المثال، في CSRF وPKCE، تُستخدم state
أو code
العشوائية لمنع الهجمات على الجلسات أو العمليات.
هناك أيضًا سيناريوهات أخرى، مثل عند استخدام خوارزميات التجزئة لمعالجة كلمات المرور ليتم كتابتها في قاعدة البيانات، إذا تم استخدام خوارزميات التجزئة البسيطة فقط، فمن الصعب مقاومة هجمات جداول قوس قزح. في مثل هذه الحالات، عند استخدام خوارزميات التجزئة، يتم إضافة Salt، وهو متغير عشوائي، لجعل نفس كلمة المرور تولد قيم تجزئة مختلفة.