دليل الأمان
توليد كلمات المرور من جانب العميل باستخدام Web Crypto وأخذ العينات بالرفض
ورقة تقنية تشرح نموذج توليد كلمات المرور من جانب المتصفح في PwdGen، وحدود الإنتروبيا، وأخذ العينات بالرفض، وحدود الخصوصية.
ملخص
يستخدم PwdGen طريقة توليد مرجعية من جانب العميل: يوفر Web Crypto في المتصفح أو بيئة التشغيل بايتات عشوائية، ويقوم أخذ العينات بالرفض بتعيين تلك البايتات إلى مؤشرات محدودة غير منحازة، ويقوم خلط Fisher-Yates بتوزيع فئات الأحرف المطلوبة عبر كلمة المرور النهائية. الطريقة صغيرة عمدًا، وقابلة للتدقيق، وقابلة للتكرار عبر تطبيق الويب، وموصل API، وواجهة سطر الأوامر، والحزمة المُعدة pwdgen-core.
يصف هذا المستند النموذج الهندسي. إنه ليس ادعاءً بوجود أولية تشفيرية جديدة، أو معيار رسمي، أو تدقيق مستقل من طرف ثالث.
مصدر العشوائية
يطلب المولد قيمًا عشوائية قوية تشفيريًا من خلال crypto.getRandomValues(). من المتوقع أن تستخدم تطبيقات Web Crypto مولد أرقام شبه عشوائي آمن تشفيريًا (CSPRNG) يتم تغذيته بإنتروبيا عالية الجودة توفرها البيئة المضيفة. عمليًا، تفوض المتصفحات هذه المسؤولية إلى مرافق نظام التشغيل ومزودي التشفير في المنصة.
لا يدعي PwdGen أن كل استدعاء لتوليد كلمة مرور يأخذ عينة مباشرة من مصدر ضوضاء الأجهزة. العبارة الأكثر دقة وأمانًا هي أن المتصفح يوفر مخرجات CSPRNG من خلال Web Crypto API، وأن PwdGen يتجنب واجهات شبه عشوائية غير تشفيرية.
لماذا ليس Math.random()
Math.random() غير محدد للاستخدام الحساس أمنيًا. إنه مناسب للمحاكاة، والتأثيرات البصرية، وسلوك واجهة المستخدم العشوائي العادي، لكنه لا يوفر الضمانات المتوقعة لكلمات المرور، ورموز إعادة التعيين، ومفاتيح التوقيع، أو بيانات الاعتماد الأخرى.
يتعامل PwdGen مع البدائل شبه العشوائية غير الآمنة كحالة فشل. إذا كان Web Crypto غير متاح، يجب على المولد عرض خطأ توافق بدلاً من إنتاج بيانات اعتماد ضعيفة بصمت.
أخذ العينات بالرفض
عادةً ما يتم سحب البايتات والأعداد الصحيحة العشوائية من نطاق قوة اثنين. نادرًا ما يكون حجم أبجديات كلمات المرور مقسومًا دقيقًا لذلك النطاق. يمكن لعملية modulo المباشرة أن تجعل بعض الأحرف أكثر احتمالًا من غيرها قليلاً.
يستخدم PwdGen أخذ العينات بالرفض:
- سحب عدد صحيح غير موقع 32 بت.
- حساب أكبر مضاعف لحجم الأبجدية يناسب داخل النطاق 32 بت.
- رفض القيم فوق تلك الحدود.
- تطبيق modulo فقط على النطاق الكامل المتبقي.
هذا يحافظ على اختيار الأحرف المحدود بشكل منتظم دون إدخال انحياز modulo قابل للقياس.
تغطية الأحرف والإنتروبيا
بالنسبة لسياسات كلمات المرور المكونة، يختار المولد أولاً حرفًا واحدًا من كل فئة مفعلة، ويملأ الباقي من الأبجدية المدمجة، ثم يخلط النتيجة. يساعد هذا في تلبية قواعد كلمة المرور الوجهة دون وضع فئة متوقعة في موضع متوقع.
تقدير الإنتروبيا النظري هو:
bits = length × log2(uniqueAlphabetSize)
تلك القيمة هي حد أعلى للاختيارات العشوائية المنتظمة من الأبجدية المكونة. لا تأخذ في الاعتبار إعادة استخدام كلمة المرور، أو المخرجات المعدلة من قبل المستخدم، أو الأجهزة المخترقة، أو كلمات المرور المسربة، أو التخزين الضعيف من قبل خدمة الوجهة.
حدود الخصوصية
في أدوات المتصفح، تبقى القيم المولدة في ذاكرة الصفحة وحقول النتائج المرئية حتى يقوم المستخدم بنسخها أو تصديرها. لا ترسل المولدات المحلية كلمات المرور المولدة إلى خوادم PwdGen، أو تضعها في عناوين URL، أو تكتبها في أحداث التحليلات.
هذه الحدود لا تحمي ضد إضافات المتصفح الضارة، أو مديري الحافظة، أو اختراق نظام التشغيل، أو التقاط الشاشة، أو صفحات التصيد، أو قيام المستخدم بلصق كلمة مرور مولدة في وجهة غير آمنة.
تنفيذ قابل للتكرار
الحزمة العامة pwdgen-cli والحزمة المُعدة pwdgen-core موجودتان للحفاظ على نموذج التوليد قابلاً للفحص خارج صفحة الويب. تغطي اختبارات الوحدة تضمين فئات الأحرف، والأحرف المستبعدة، والتكوينات غير الصالحة، وصيغ الإنتروبيا، وغياب مسارات الكود البديلة شبه العشوائية غير الآمنة.
الهدف ليس جعل PwdGen معيارًا خاصًا. الهدف هو جعل التنفيذ صغيرًا بما يكفي ليتمكن المطورون من قراءته واختباره واستبداله عندما تتطلب بيئتهم حد ثقة مختلفًا.