طريقة الاستخدام
- اضبط «الطول»، واختر في «الوحدة» ما إذا كان يُحسب بـ «بايتات البيانات العشوائية» أو بـ «الأحرف» في Base64. ولتوليد مفتاح، استخدم البايتات: فـ 32 بايتًا تعني مفتاحًا بطول 256 بت.
- اضبط «العدد» على عدد السلاسل التي تحتاجها، واختر «الفاصل» بينها: «سطر جديد» أو «فاصلة» أو «مسافة».
- اختر في «النوع» القيمة «قياسي» أو «آمن لعناوين URL». ومع وحدة البايتات يمكنك أيضًا إيقاف «الحشو» إذا كان النظام المستهدف لا يتوقع علامات =.
- انقر «توليد» للحصول على قيم جديدة، ثم انقر «نسخ الكل» أو نزّل القائمة عبر «تنزيل».
البايتات والأحرف والإنتروبيا
تُقاس قوة السلسلة العشوائية بعدد بتات الإنتروبيا. فكل بايت عشوائي يضيف 8 بتات، لذا تعطي 16 بايتًا 128 بت، وتعطي 32 بايتًا 256 بت. ولا يغيّر Base64 إلا طريقة كتابة هذه البايتات: فكل حرف يحمل 6 بتات، وكل 3 بايتات تصبح 4 أحرف. وتعرض الأداة إنتروبيا كل سلسلة، فيمكنك التحقق منها بنظرة سريعة.
عند اختيار بايتات البيانات العشوائية وحدةً، تُفك المخرجات إلى هذا العدد بالضبط من البايتات العشوائية، وهذا ما تحتاجه المفاتيح والأسرار. وعند اختيار الأحرف، تحصل على عدد محدد بالضبط من الأحرف، يُختار كل منها باحتمال متساوٍ من الأبجدية المكوّنة من 64 حرفًا؛ استخدمها عندما يطلب نظام ما رمزًا مميزًا بطول ثابت ويخزّنه نصًا.
| البايتات | أحرف Base64 | الإنتروبيا | الاستخدام المعتاد |
|---|---|---|---|
| 12 | 16 | 96 بت | قيمة nonce (IV) في AES-GCM |
| 16 | 24 (22 بلا حشو) | 128 بت | قيم الملح، ورموز الجلسات وCSRF، ومفاتيح AES-128 |
| 32 | 44 (43 بلا حشو) | 256 بت | مفاتيح AES-256 وHMAC-SHA256، والمفاتيح السرية لـ HS256، ومفاتيح API |
| 64 | 88 (86 بلا حشو) | 512 بت | مفاتيح HMAC-SHA512، والمفاتيح السرية لـ HS512 |
أين تُستخدم قيم Base64 العشوائية
- المفاتيح السرية لـ JWT. يشترط RFC 7518 ألا يقل طول مفتاح HMAC عن طول مخرجات دالة التجزئة: 32 بايتًا لـ HS256، و48 لـ HS384، و64 لـ HS512. تستخدم بعض المكتبات سلسلة المفتاح السري كما هي، بينما تفك مكتبات أخرى ترميزها من Base64 أولًا، لذا تحقّق مما تتوقعه مكتبتك. وتتحقق أداة فك ترميز JWT من تواقيع HS256 حتى HS512 بأي من نوعي المفتاح السري، ويقبل مولّد HMAC المفتاح نصًا أو بالصيغة الست عشرية أو بترميز Base64.
- مفاتيح التطبيقات. يحفظ Laravel مثلًا مفتاح تشفير من 32 بايتًا في ملف
.envبالصيغةAPP_KEY=base64:...، وهي الصيغة نفسها لسلسلة من 32 بايتًا تولّدها هذه الأداة. - Kubernetes Secrets. يجب أن تكون القيم الموجودة تحت
dataبترميز Base64 القياسي مع الحشو. ويمكن وضع سلسلة مولّدة بوحدة البايتات مع النوع «قياسي» وتفعيل الحشو هناك مباشرةً، فيتلقى الـ Pod البايتات العشوائية الخام. أما إذا كان التطبيق يتوقع نص Base64 نفسه، فضعه تحتstringDataبدلًا من ذلك. - الرموز المميزة في عناوين URL. ينبغي أن تستخدم روابط إعادة تعيين كلمة المرور ورموز الدعوة وغيرها من الرموز المميزة التي تنتقل عبر عناوين URL النوعَ الآمن لعناوين URL، الذي يضع
-و_مكان+و/. راجع Base64URL لمزيد من التفاصيل.
لماذا تولّد الأداة القيم العشوائية باستخدام crypto.getRandomValues وليس Math.random
Math.random() مولّد سريع للأغراض العامة. ولم تُصمَّم مخرجاته لتكون غير قابلة للتنبؤ، بل يمكن في بعض المحركات إعادة بناء حالته الداخلية من عدد قليل من القيم. أما هذه الأداة فتستخدم crypto.getRandomValues()، وهو مولّد آمن تشفيريًا يستمد بذرته من نظام التشغيل، أي من نوع المصدر نفسه الذي يعتمد عليه openssl rand ووحدة secrets في Python. وتُنشأ القيم على جهازك ولا تُرسل أو تُخزَّن أبدًا.
توليد Base64 عشوائي في الشيفرة البرمجية
# Shell: 32 بايتًا عشوائيًا بترميز Base64 (44 حرفًا)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # آمن لعناوين URL، بلا حشو، 43 حرفًا
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // آمن لعناوين URL، بلا حشو
// المتصفح
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
الأسئلة الشائعة
ما الطول المناسب لمفتاح أو سر عشوائي؟
تكفي 16 بايتًا (128 بت) للقيم التي لا يُشترط فيها إلا أن تكون فريدة ويستحيل تخمينها، مثل معرّفات الجلسات ورموز CSRF وقيم الملح. واستخدم 32 بايتًا (256 بت) لمفاتيح AES-256 ومفاتيح HMAC-SHA256 والمفاتيح السرية لـ HS256، و64 بايتًا لـ HMAC-SHA512 وHS512.
هل هذا مماثل لـ openssl rand -base64 32؟
= واحدة، وتُفك إلى 32 بايتًا عشوائيًا. أما القيم نفسها فتختلف بالطبع في كل مرة.هل أستخدم وحدة البايتات أم وحدة الأحرف؟
استخدم البايتات عندما ستُفك السلسلة لاحقًا، كما في مفاتيح التشفير وKubernetes Secrets. واستخدم الأحرف عندما يحتاج نظام ما رمزًا مميزًا بطول محدد بالضبط ويستخدم النص كما هو. ولا يُضمن أن تُفك سلسلة مولّدة بوحدة الأحرف فكًا سليمًا إلا إذا كان طولها من مضاعفات 4.
متى أحتاج إلى النوع الآمن لعناوين URL؟
/ بين أجزاء مسارات URL، وتتحول + إلى مسافة في سلاسل الاستعلام المرمّزة بصيغة النماذج. أما Base64 الآمن لعناوين URL فيستخدم - و_ بدلًا منهما، ويُكتب عادةً بلا حشو.هل تُخزَّن القيم المولّدة أو تُرسل إلى أي مكان؟
لا. تولّدها JavaScript في متصفحك، ولا تُرسل أبدًا، وتختفي عند مغادرة الصفحة. وبمجرد أن تستخدم إحداها سرًا حقيقيًا، احفظها في مدير كلمات مرور أو مخزن أسرار، لا في رسائل الدردشة أو التذاكر.