ولّد رموزًا عشوائية قوية تشفيريًا ومفاتيح API وأسرارًا وقيم nonce في متصفحك. اختر الطول ومجموعة الأحرف وعدد الرموز المطلوبة.
رموز عشوائية غير قابلة للتنبؤ. كل العشوائية تأتي من crypto.getRandomValues في المتصفح، نفس المصدر الذي تستخدمه المتصفحات لمفاتيح TLS. لا شيء يغادر جهازك.
ما الذي يجعل الرمز آمنًا للاستخدام
العشوائية ليست عدم القابلية للتنبؤ
معظم اللغات تأتي بمولّدي أرقام عشوائية مختلفين تمامًا. Math.random() وrand() وأمثالهما مولّدات شبه عشوائية سريعة تُزرع من شيء رخيص مثل الساعة. إنها مناسبة لخلط قائمة تشغيل وكارثية لإنشاء رمز مميز، لأن المهاجم الذي يرصد بضع مخرجات يمكنه غالبًا استعادة الحالة الداخلية وإعادة إنتاج كل قيمة سيصدرها المولّد يومًا ما.
صُمّم المولّد الآمن تشفيريًا بحيث لا تخبرك معرفة المخرجات السابقة بشيء عن المخرجات المستقبلية. في المتصفح هو crypto.getRandomValues()، الذي يستمد من تجمّع الإنتروبيا في نظام التشغيل. تستخدم هذه الأداة حصريًا. إذا كنت تولّد رموزًا في كودك الخاص، فالمكافئات هي secrets في بايثون، وcrypto/rand في Go، وjava.security.SecureRandom في جافا — وليس وحدة random العادية أو Math.random().
تجنّب الانحياز النمطي (modulo bias)
امتلاك بايتات عشوائية جيدة نصف المهمة فقط. الطريقة الساذجة لاختيار حرف هي bytes[i] % alphabet.length، وهي تحرّف النتيجة بهدوء كلما لم يقسم حجم الأبجدية 256 بالتساوي. مع أبجدية من 62 حرفًا، تظهر الأحرف الثمانية الأولى أكثر بقليل من البقية — انحياز صغير، لكنه يقلل الإنتروبيا الفعلية ويمكن تجنبه تمامًا.
الحل هو أخذ العينات بالرفض: تجاهل أي بايت يقع في الكتلة الأخيرة غير المكتملة وأعد السحب. هذه الأداة تفعل ذلك، لذا فكل حرف في الأبجدية المختارة متساوي الاحتمال.
اختيار الطول
الإنتروبيا هي log2(alphabet_size) * length بت. أبجدية من 62 حرفًا تعطي نحو 5.95 بت لكل حرف، لذا يحمل رمز من 22 حرفًا نحو 131 بت — مريح جدًا فوق القوة الغاشمة. لأي شيء يحرس وصولًا حقيقيًا، 128 بت هو الحد الأدنى المعتاد؛ دون نحو 64 بت يصبح المهاجم العازم مع نقطة نهاية سريعة مصدر قلق حقيقيًا.
اختيار الأبجدية يتعلق غالبًا بمكان انتقال الرمز. ينجو Base64url وhex من عناوين URL وأسماء الملفات والترويسات دون تغيير. أبجدية بلا غموض تستبعد أحرفًا مثل 0/O و1/l/I وتستحق الاستخدام لأي شيء سيقرأه إنسان بصوت عالٍ أو يعيد كتابته من الشاشة.
الأسئلة الشائعة
هل يُولَّد الرمز على جهازي؟
نعم، بالكامل في متصفحك باستخدام crypto.getRandomValues(). لا يُرسَل شيء إلى خادم ولا يُسجَّل شيء، لذا القيمة التي تراها لا يعرفها سواك.
كم يجب أن يكون طول الرمز؟
لأي شيء يحرس الوصول، اهدف إلى 128 بت من الإنتروبيا على الأقل: 22 حرفًا على أبجدية من 62 حرفًا، أو 32 حرفًا سداسيًا. القيم الأقصر مناسبة لمعرّفات غير أمنية.
لماذا لا تستخدم Math.random() لهذا؟
إنه مولّد شبه عشوائي سريع يُزرع من شيء رخيص مثل الساعة. رصد حفنة من المخرجات قد يكون كافيًا لاستعادة حالته والتنبؤ بكل قيمة مستقبلية.
ما فائدة خيار الأحرف غير الغامضة؟
يزيل 0/O و1/l/I حتى ينجو الرمز من القراءة بصوت عالٍ أو الكتابة على ورق أو إعادة كتابته من الشاشة دون أخطاء نقل.
هل يمكنني استخدامه لروابط إعادة تعيين كلمة المرور؟
نعم، بشرط تخزين تجزئة الرمز فقط، وتعيين صلاحية قصيرة، وإبطاله بعد استخدام واحد. العشوائية هنا مناسبة؛ دورة الحياة من مسؤولية تطبيقك.
هل يمكن أن يعود الرمز نفسه يومًا ما؟
مع 128 بت من الإنتروبيا، التكرار مستبعد فلكيًا، لكن الأداة لا تحتفظ بأي سجل، لذا لا يمكنها التحقق من التفرد عبر الأجيال نيابةً عنك.