الجواب المختصر
الشك الكامن وراء هذا السؤال في محله تماما، فتمسك به. الصفحة التي تصنع كلمات المرور هي الصفحة الوحيدة على الويب التي لا تتلقى شيئا حساسا وتستطيع الاحتفاظ بكل ما هو حساس: ناتجها هو السر نفسه، والمولد الذي يرسل ما يصنعه لن يكون أداة ضعيفة بل مجموعة كلمات مرور. السؤال ليس أبدا هل تبدو صفحة التوليد جديرة بالثقة، بل هل تستطيع الاحتفاظ بكلمة المرور لو أرادت — وهذا، على غير المعتاد، قابل للفحص.
ثلاثة أشياء تحسم الأمر: من أين تأتي العشوائية، وهل يستطيع الناتج مغادرة الصفحة، وهل في الناتج شيء يمكن التنبؤ به. للثلاثة أجوبة أمينة يستطيع الزائر التحقق منها — وهذا أكثر مما يقال عن برنامج منزل يولد في نافذة لا يرى أحد داخلها.
من أين تأتي عشوائية المتصفح
كل مولد جاد في متصفح يغترف من بئر واحدة: crypto.getRandomValues، مولد العشوائية التشفيري في المتصفح، يبذره نظام التشغيل من ضجيج العتاد ويعيد بذره باستمرار. وهو المصدر نفسه الذي يستمد منه المتصفح مفاتيح TLS — التشفير الذي يجري عليه اتصالك بالمصرف. لا معنى مفيدا للقول إن برنامج سطح المكتب يصل إلى عشوائية أفضل مما تصل إليه صفحة ويب؛ فكلاهما ينتهي عند بئر النظام نفسها.
أما ما يجب ألا تستعمله الصفحة فهو Math.random()، دالة رمي النرد للاستعمال اليومي. تنفذها المتصفحات بمولد سريع يمكن إعادة بناء حالته الداخلية من حفنة مخرجات متتالية — فكلمات المرور المبنية عليه تبدو عشوائية وهي قابلة للحساب لدى كل من رأى واحدة منها. وليس هذا نظريا؛ فقد أثبت عمليا ضد مولدات متداولة أكثر من مرة. وهو غير مرئي من الخارج، وذلك أقوى حجة لمصلحة المولدات التي يمكن قراءة شيفرتها: الفرق بين الدالتين كلمة واحدة في المصدر.
وثمة درجة عناية أدق. تحويل كلمات عشوائية من 32 بتا إلى «رقم دون 26» بباقي القسمة البسيط منحاز انحيازا طفيفا جدا نحو الحروف الأولى؛ والمولد المتقن يسحب من جديد بدل أخذ الباقي. المولد هنا يفعل ذلك — والانحياز الذي يتجنبه نحو واحد في 165 مليونا: غير مرئي في الاستعمال، وهو بالضبط ذلك الصنف من التفاصيل الذي يفصل أداة بنيت للمهمة عن مقطع شيفرة منسوخ من منتدى.
ما الذي قد تفعله صفحة توليد سيئة
لنسم أوجه الفشل بأسمائها، فكل واحد منها قابل للفحص:
- إرسال كلمة المرور إلى الخارج. تولد الصفحة محليا ثم ترسل ما ولدته — مع النقرة، مع التحليلات، أو دفعة واحدة لاحقا. هذا هو العيب المقصي، وهو مرئي: لا بد أن يكون طلب شبكة، والطلبات تراقب.
- التوليد على الخادم. تصل كلمة المرور عبر الشبكة بدل أن تغادر عبرها — فيكون المشغل قد رآها أولا، ولا تتعلم أنت شيئا عن كيفية صنعها. الفحص نفسه، بالاتجاه الآخر.
- التوليد الضعيف.
Math.random، بذرة من طابع زمني، قائمة كلمات من بضع مئات تباع على أنها قوية. هذا لا يمسكه لسان شبكة؛ يمسكه فقط مصدر مقروء، أو مؤشر قوة أمين محسوب من الإعدادات الفعلية. - الاحتفاظ بسجل. تذكر آخر عشرين كلمة مرور لك بدافع الخدمة — في مخزن يعمر بعد إغلاق اللسان، على جهاز قد يكون مشتركا.
مولد كلمات المرور وعبارات المرور في هذا الموقع محصن ضد الأربعة كلها بحكم البناء: crypto.getRandomValues ولا شيء غيره، والتوليد داخل الصفحة، ولا تخزين من أي نوع، ولا سجل، وسطر قوة يبلغ بالضبط كم نتيجة كانت ممكنة بإعداداتك. وقوائم الكلمات لعبارات المرور هي قوائم Diceware من مؤسسة EFF، مرفقة دون تغيير في مجلد الأداة.
كيف تفحص أي مولد، وهذا منها
الطريقة كاملة مكتوبة في دليل الرفع، وهذه هي الصفحة التي تطبق عليها قبل غيرها:
- انزع القابس أولا. حمل الصفحة، اقطع الاتصال، ثم ولد. كلمة مرور صنعت بلا اتصال لا يمكن أن تكون جلبت من الخارج ولا أن تكون أرسلت لحظة صنعها. هذه الصفحة تواصل العمل دون اتصال؛ وذلك مغزاها.
- راقب لسان الشبكة وأنت تولد. اضغط الزر واقرأ القائمة: لا ينبغي أن يغادر شيء. ثم انسخ كلمة المرور وراقب مرة أخرى — فالنسخ هو اللحظة التي كانت صفحة غير أمينة ستختارها.
- ابحث عما تحتاجه مجموعة. حساب، ميزة مزامنة، قائمة «ولدت مؤخرا». المولد ذو الذاكرة يملك نسخة.
وتحفظ أمين يليق بالخاتمة. الفحص يخبرك بما فعلته الصفحة وأنت تنظر؛ أما الشيفرة المنشورة المقدمة مقروءة — ككل شيء في هذا الموقع — فتخبرك بما تفعله عموما. تبقى الآلة نفسها: لا صفحة ويب تحمي كلمة مرور من متصفح مخترق أو برمجية تجسس، والمولد ليس استثناء. ما تشتريه لك الفحوص أصغر وحقيقي — كلمة مرور لم يرها خادم قط، صنعتها حسابات سمح لك أن تقرأها.