سجل التعديلات (3 تحديثات، آخر تحديث 3 Sep، 2026)
سجل بالتغييرات التي أُجريت على هذا المقال. وحيثما حُفظت نسخة سابقة، تبقى متاحة للقراءة عبر رابط دائم يحمل معرّف DOI.
- أُضيفت روابط الاستشارة الموجودة في الأصل الياباني (consultation_services). ولم يتغيّر نصّ المقالة نفسه. قراءة النسخة السابقة لهذا التحديث (DOI: 10.5281/zenodo.22240922)
- أُعيدَت الترجمة العربية كترجمة كاملة عن النص الياباني الأصلي، وأُضيفَت خريطة المعرفة.
- أعيدت الترجمة كترجمة كاملة عن النص الياباني الأصلي. كانت النسخة العربية السابقة مختصراً يسقط أبواباً وجداول ورسوم Mermaid وتعليقات الأشكال وFAQ. أُعيدت هذه العناصر وفق الأصل الياباني، والادّعاءات التقنية مطابقة للنسخة اليابانية.
- النشر الأول
الاستشهاد بهذا المقال(DOI: 10.5281/zenodo.21621507)
هذا المقال محفوظ على Zenodo. يرد أدناه معرّف DOI الذي يشير دائمًا إلى أحدث نسخة، ومعرّف DOI المثبَّت على النسخة التي تقرؤها.
小村 豪 (2026). ما الفرق بين الأرقام شبه العشوائيّة والأرقام العشوائيّة الحقيقيّة - كيف نميّز بينها. شركة كومورا سوفت ذ.م.م.. https://doi.org/10.5281/zenodo.21621507 https://comcomponent.com/ar/blog/2026/04/17/000-pseudo-random-vs-true-random-how-to-distinguish/
- DOI (أحدث نسخة)
- 10.5281/zenodo.21621507
- DOI (هذه النسخة)
- 10.5281/zenodo.22279950
حديث الأرقام العشوائيّة ينحرف سريعًا لأنّ أشياء شديدة الاختلاف تُدعى كلّها بكلمة واحدة هي عشوائيّ. المتتالية المحسوبة مثل Math.random() والمتتالية المستمدّة من ظاهرة فيزيائيّة مثل الضجيج الحراريّ أو jitter الساعة تبدوان، بالمظهر وحده، متبعثرتين بدرجة معقولة.
غير أنّ ترك هذا الفرق ضبابيًّا في الممارسة يسهّل أخطاء حكم كهذه:
- تريد قابليّة الإعادة في محاكاة، لكنّ النتيجة تتغيّر في كلّ تشغيل
- تولّد رموز إعادة تعيين كلمة المرور بأرقام عشوائيّة يسهل التنبّؤ بها
- تظنّ أنّ اجتياز اختبار إحصائيّ يعني «إذن هذه أرقام عشوائيّة حقيقيّة»
- أو، في الاتجاه المعاكس، تسمع
شبهفتعدّ الكلّ خطرًا
ترتّب هذه المقالة ما تعنيه الأرقام شبه العشوائيّة و ما تعنيه الأرقام العشوائيّة الحقيقيّة و كيف نميّز بينها بشكل يسهّل الحكم في العمل. التركيز ليس على مظهر المخرجات، بل على تكوين المولّد.
المحتوى قائم على وثائق NIST و IETF ونظام التشغيل والوثائق الرسميّة للّغات التي أمكن التحقّق منها حتّى أبريل 2026.
جدول المحتويات
- الخلاصة أوّلًا (بجملة)
- ما تقصده هذه المقالة بـ «شبه عشوائيّ» و «عشوائيّ حقيقيّ»
- ترتيب في صفحة واحدة
- 3.1. مخطّط العلاقات
- 3.2. أقصر ترتيب للمصطلحات
- ما هي الأرقام شبه العشوائيّة
- 4.1. بجملة واحدة
- 4.2. افصل PRNG العاديّ عن CSPRNG
- ما هي الأرقام العشوائيّة الحقيقيّة
- 5.1. بجملة واحدة
- 5.2. حتّى العشوائيّة الفيزيائيّة لا تُستخدم دائمًا كما هي
- ما الذي يختلف
- 6.1. مصدر التوليد
- 6.2. قابليّة الإعادة
- 6.3. قابليّة التنبّؤ
- 6.4. السرعة والتشغيل
- كيف نميّز بينها
- 7.1. من المخرجات وحدها لا يكتمل التمييز من حيث المبدأ
- 7.2. أوّل ما يُنظر إليه تصميم المولّد
- 7.3. ثمّ البحث عن عيوب واضحة بالاختبار الإحصائيّ
- 7.4. في الاستخدام الأمنيّ، انظر بعين المهاجم
- أيّها يُستخدم حسب الغرض
- 8.1. أصغر أمثلة استخدام
- سوء فهم شائع
- جدول حكم عند التردّد في الممارسة
- الخلاصة
- المراجع
في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 16، مع الأدلّة ودرجة اليقين) وتعريفات المفاهيم الرئيسة مجمّعة في صفحة تفاصيل خريطة المعرفة (باليابانية). البيانات: JSON-LD / Turtle
1. الخلاصة أوّلًا (بجملة)
أوّلًا، بعبارة خشنة لكنّها تنفع في العمل، الأمر كالآتي.
- الأرقام شبه العشوائيّة متتالية تُصنع حتميًّا من حالة داخليّة وخوارزميّة
- الأرقام العشوائيّة الحقيقيّة متتالية مصدر entropy فيها ظاهرة فيزيائيّة مثل الضجيج الحراريّ أو jitter
- غير أنّ معظم واجهات الأرقام العشوائيّة الآمنة المستخدمة عمليًّا لا تعيد العشوائيّة الفيزيائيّة كما هي، بل تعيد
DRBG / CSPRNGمزروعًا من مصدر entropy - لذلك لا يكفي
هل يبدو عشوائيًّا. ما يُنظر إليه هو تكوين المولّد، ودخول الـ seed، وإعادة الزرع، و health test - في المحاكاة واختبار الإعادة، قابليّة إعادة شبه العشوائيّ سلاح
- في الاستخدام الأمنيّ مثل المفاتيح والرموز و nonce، الأساس واجهة آمنة يوفّرها نظام التشغيل أو اللغة
بمعنى آخر، فصل هذه الثلاثة أوّلًا يصعّب الانحراف.
- هل الحديث عن
PRNG عاديّ - أم عن
PRNG مشفّر / CSPRNG / DRBG - أم عن
NRBG / TRNG يملك مصدر entropy فيزيائيًّا
2. ما تقصده هذه المقالة بـ «شبه عشوائيّ» و «عشوائيّ حقيقيّ»
هنا، قول أرقام عشوائيّة وحده يوسّع الموضوع أكثر ممّا ينبغي. لذلك نثبّت المعنى أوّلًا.
- الأرقام شبه العشوائيّة (PRNG): ما يولّد متتالية بإجراء حتميّ من seed وحالة داخليّة. بالشروط نفسها تخرج المتتالية نفسها
- الأرقام شبه العشوائيّة المشفّرة (CSPRNG / DRBG): نوع من شبه العشوائيّ، لكنّه يركّز على صعوبة التنبّؤ. يعرّف NIST SP 800-90A هذا deterministic random bit generator
- الأرقام العشوائيّة الحقيقيّة: في الكلام اليوميّ كثيرًا ما تعني
العشوائيّة الحقيقيّةأوالعشوائيّة الفيزيائيّة. في NIST العبارة الأقربNRBG(non-deterministic random bit generator)، ويُشرح على أنّه يرجع دائمًا إلى مصدر entropy ويملك في الحالة السليمة مخرجات full entropy
لأنّ التسمية تختلف حسب المجال، نثبّت أيضًا مقابلة الكلام اليوميّ لمصطلح المعيار. فيما يلي نستخدم تسمية العمود الأيسر.
| التسمية في هذه المقالة | عبارات أخرى شائعة | الاختصار المقابل | التوسعة الإنجليزيّة |
|---|---|---|---|
| أرقام شبه عشوائيّة | أرقام شبه عشوائيّة (صيغة أخرى) | PRNG | pseudorandom number generator |
| أرقام شبه عشوائيّة مشفّرة | أرقام شبه عشوائيّة للتشفير، أرقام عشوائيّة للتشفير | CSPRNG، DRBG | cryptographically secure pseudorandom number generator، deterministic random bit generator |
| أرقام عشوائيّة حقيقيّة | عشوائيّة حقيقيّة، أرقام حقيقيّة، عشوائيّة فيزيائيّة، عشوائيّة عتاد | NRBG، TRNG | non-deterministic random bit generator، true random number generator |
| مصدر entropy | مصدر ضجيج | — | entropy source |
نقطتان إضافيّتان.
- المصطلحات التي يستخدمها NIST SP 800-90A / 90B / 90C هي
DRBGوNRBGوentropy source.CSPRNGوTRNGليستا مصطلحي معيار، بل تسميتان شائعتان في الممارسة والأدبيّات - في اليابانيّة تُستخدم صيغتان للكتابة. هذه المقالة تثبّت «شبه عشوائيّ». أسماء الوثائق في المراجع تبقى كما في الأصل
المهمّ هنا أنّ شبه عشوائيّ و أرقام عشوائيّة خطرة ليسا مترادفين.
مثلًا، PRNG سريع مثل المولّد الخطّيّ التوافقيّ أو xorshift البسيط، و CSPRNG مثل CTR_DRBG أو HMAC_DRBG، كلاهما حتميّ، لكنّ معناهما الأمنيّ مختلف جدًّا.
3. ترتيب في صفحة واحدة
3.1. مخطّط العلاقات
أسرع طريق هو رؤية موضع المفاهيم في صفحة واحدة.
flowchart LR
NOISE["ظاهرة فيزيائيّة<br/>ضجيج حراريّ و jitter وغيرهما"] --> ENT["مصدر entropy"]
ENT --> SEED["seed / reseed"]
SEED --> DRBG["DRBG / CSPRNG<br/>يبسط الأرقام العشوائيّة بسرعة"]
DRBG --> API["الأرقام العشوائيّة التي يعيدها نظام التشغيل / المكتبة"]
STATE["حالة داخليّة + صيغة"] --> PRNG["PRNG عاديّ"]
PRNG --> OUT["متتالية تبدو عشوائيّة"]
المهمّ هنا أنّ مخرجات واجهة الأرقام العشوائيّة الآمنة التي يستقبلها التطبيق تختلف قليلًا عن PRNG العاديّ على اليمين وعن الضجيج الفيزيائيّ الخام على اليسار.
كثير من التنفيذات تزرع / تعيد الزرع بمصدر entropy على اليسار، ثمّ تبسط القيمة بسرعة بـ DRBG / CSPRNG. NIST SP 800-90B و 800-90C وثيقتان ترتّبان تحديدًا تكوين entropy source + deterministic generator.
3.2. أقصر ترتيب للمصطلحات
| النوع | ممّ يُصنع | إعادة بالشروط نفسها | ما يُطلب بقوّة | الاستخدام المناسب |
|---|---|---|---|---|
| PRNG عاديّ | صيغة وحالة داخليّة | ممكن | السرعة وقابليّة الإعادة | المحاكاة، الألعاب، الاختبار |
| CSPRNG / DRBG | خوارزميّة تشفير + seed | ممكن | صعوبة التنبّؤ | المفاتيح، الرموز، nonce، معرّف الجلسة |
| أرقام عشوائيّة حقيقيّة / NRBG | مصدر entropy فيزيائيّ | غير ممكن في الأساس | عدم التعيين الفيزيائيّ و entropy | تغذية الـ seed، أجهزة المصادقة، سحب ثقيل التدقيق |
للحفظ بأقصر صيغة:
- PRNG العاديّ هو
أرقام عشوائيّة يمكن إعادتها - CSPRNG هو
أرقام عشوائيّة يمكن إعادتها، لكنّها مصمَّمة ليصعب التنبّؤ بها من الخارج - الأرقام العشوائيّة الحقيقيّة هي
أرقام عشوائيّة تُستخرج entropy من ظاهرة فيزيائيّة
4. ما هي الأرقام شبه العشوائيّة
4.1. بجملة واحدة
الأرقام شبه العشوائيّة تصنع بالحساب متتالية تبدو عشوائيّة مع تحديث الحالة الداخليّة.
إن وُضع الـ seed نفسه، وبالخوارزميّة نفسها، وبالعدد نفسه من الأخذ، خرجت متتالية القيم نفسها. يبدو هذا عيبًا أحيانًا، لكنّه في المحاكاة والاختبار والتنقيح مزيّة كبيرة.
لأنّ الإعادة ممكنة، يصير تشغيل مثل يظهر الخلل بهذا الـ seed و نريد مقارنة نتيجة الأمس مرّة أخرى ممكنًا.
4.2. افصل PRNG العاديّ عن CSPRNG
هنا أكثر موضع يُساء فهمه. شبه عشوائيّ = مزيف = لا يُستخدم ليس صحيحًا.
يعرّف NIST SP 800-90A مولّد بتات عشوائيّة حتميًّا قائمًا على دوالّ التجزئة أو تشفير الكتل. أي أنّ نواة الأرقام العشوائيّة المستخدمة في التشفير، في جزء كبير منها، مولّد حتميّ أيضًا.
الفرق ليس مجرّد شبه العشوائيّة، بل صعوبة التنبّؤ من منظور المهاجم.
- PRNG عاديّ
- سريع
- سهل الإعادة
- إن تسرّبت الحالة الداخليّة أو الـ seed سهُل التنبّؤ
- CSPRNG / DRBG
- حتميّ هو أيضًا
- لكنّه يُصمَّم ليصعب التنبّؤ بالمخرجات ما دامت الحالة الداخليّة غير معروفة
- في الاستخدام الأمنيّ يُستخدم هذا
لذلك الحكم على الأمان بـ هل هو شبه عشوائيّ أم لا وحده يخطئ في الغالب. ما يُنظر إليه هو أيّ شبه عشوائيّ.
5. ما هي الأرقام العشوائيّة الحقيقيّة
5.1. بجملة واحدة
الأرقام العشوائيّة الحقيقيّة تستخرج entropy من عدم تعيين فيزيائيّ مثل الضجيج الحراريّ، و jitter المهتزّ، وضجيج الانهيار، والظواهر الكمّيّة.
في الكلام اليوميّ تُدعى عشوائيّة حقيقيّة أو عشوائيّة فيزيائيّة. في مصطلح NIST العبارة الأقرب NRBG، وموقعها مولّد يصل دائمًا إلى مصدر entropy، ويملك ما دام يعمل سليمًا مخرجات full entropy.
5.2. حتّى العشوائيّة الفيزيائيّة لا تُستخدم دائمًا كما هي
هذه النقطة مهمّة أيضًا. كونها أرقامًا عشوائيّة حقيقيّة لا يعني تمرير القيمة المقاسة الخام إلى التطبيق كما هي.
للمصدر الفيزيائيّ صعوبات عمليّة عدّة.
- فيه انحياز
- يتأثّر بدرجة الحرارة والتغذية والعطل والتآكل
- سرعة المخرجات الخام قد لا تكون عالية
- من دون فحص صحّة يصعب ملاحظة العطل
لذلك يركّز NIST SP 800-90B على مبادئ تصميم مصدر entropy، وتفكير min-entropy، و validation test، و health testing. وعلى مستوى التنفيذ ككلّ كثيرًا ما يُستخدم تكوين entropy source + DRBG كما في NIST SP 800-90C.
في النهاية، الأرقام العشوائيّة الحقيقيّة ليست شيئًا خامًا غامضًا، بل تُعامل بما يشمل المصدر الفيزيائيّ والتقييم والمراقبة والمعالجة اللاحقة.
6. ما الذي يختلف
فرق الأرقام العشوائيّة لا يُرتَّب بـ هل تبدو عشوائيّة وحده. على الأقلّ، هذه المحاور الأربعة توضّح الصورة.
6.1. مصدر التوليد
- شبه عشوائيّ: خوارزميّة وحالة داخليّة
- عشوائيّ حقيقيّ: مصدر entropy فيزيائيّ
هذا أكثر الفرق جوهرًا.
6.2. قابليّة الإعادة
- شبه عشوائيّ: يمكن الإعادة بالـ seed نفسه
- عشوائيّ حقيقيّ: إعادة الأخذ بالشروط نفسها نادرًا ما تعيد متتالية القيم نفسها
قابليّة الإعادة قوّة في الاختبار، وقد تكون ضعفًا في السحب.
6.3. قابليّة التنبّؤ
- PRNG عاديّ: إن قُرئ الـ seed أو الحالة الداخليّة بان التالي كثيرًا
- CSPRNG: يُصمَّم ليصعب الاستباق ما دامت الحالة الداخليّة محميّة
- عشوائيّ حقيقيّ: إن كان المصدر الفيزيائيّ سليمًا صعب التنبّؤ، لكنّ عطل المستشعر أو خلل التصميم مسألة أخرى
في الأمن هذا المحور الأهمّ. تبعثر المظهر أقلّ أثرًا من إمكان إصابة القيمة التالية.
6.4. السرعة والتشغيل
- شبه عشوائيّ: سريع، مستقرّ، سهل التنفيذ
- عشوائيّ حقيقيّ: يلزم جمع entropy ومراقبة، وفيه قيد على السرعة وتكلفة التنفيذ
لذلك في أنظمة الإنتاج الخيار ليس عشوائيّ حقيقيّ فقط أو شبه عشوائيّ فقط، بل CSPRNG مزروع بـ entropy فيزيائيّ هو الأكثر واقعيّة.
7. كيف نميّز بينها
7.1. من المخرجات وحدها لا يكتمل التمييز من حيث المبدأ
أهمّ جواب هو هذا. لا يمكن الجزم من متتالية مخرجات محدودة بأنّ هذه أرقام عشوائيّة حقيقيّة.
السبب بسيط: يمكن دائمًا بناء برنامج حتميّ يعيد المتتالية المحدودة المرصودة نفسها تمامًا. في الطرف الأقصى يكفي دفن تلك المتتالية في مصفوفة أو ROM وإعادتها بالترتيب.
لذلك لا يقال يبدو طبيعيًّا إذن هو حقيقيّ. حتّى NIST SP 800-22 يعدّ الاختبار الإحصائيّ خطوة أولى، لا إثباتًا مطلقًا لصلاحية المولّد.
وبالعكس، يُصنع CSPRNG الجيّد ليصعب تمييزه بالنظر إلى المخرجات وحدها. تعذّر التمييز هنا هدف تصميم في الواقع.
7.2. أوّل ما يُنظر إليه تصميم المولّد
جواب 7.1 كان «من المخرجات وحدها لا يكفي». فماذا يُنظر إليه. يُنظر إلى المولّد نفسه لا إلى المخرجات.
حتّى إن بدت متتاليتان كأنّهما توزيع منتظم، قد تُصنع إحداهما بالحساب من seed، وتُؤخذ الأخرى من ظاهرة فيزيائيّة. هذا الفرق لا يظهر مهما أطلت النظر في المتتالية. يظهر أوّل مرّة حين تتحقّق من طريقة الصنع. أي أنّ التمييز عمل «تحقّق» لا «رصد».
بنود التحقّق خمسة.
- ما خوارزميّة التوليد
- PRNG بسيط أم DRBG / CSPRNG
- من أين يأتي الـ seed
- seed ثابت، وقت، PID تقريبًا
- أم من مصدر entropy في نظام التشغيل
- هل يُعاد الزرع
- زرع مرّة عند الإقلاع ثمّ انتهى
- أم يُعاد الإدخال أثناء التشغيل
- هل يوجد تحقّق من مصدر entropy
- تقييم min-entropy
- health test
- كشف العطل
- أيّ واجهة تُستخدم
- تنفيذ ذاتيّ
- أم واجهة قياسيّة لنظام التشغيل / اللغة
لا يلزم استنفاد الخمسة. انظر من الأعلى وقف حين يظهر الجواب. عمليًّا يحسم الأمر في الغالب البندان الأعلى ما خوارزميّة التوليد والأدنى أيّ واجهة تُستخدم.
بهذا المنظور يمكن تمييز حالات كثيرة.
تثبيت الـ seed يعيد المتتالية نفسها كلّ مرّة→ شبه عشوائيّيوجد مصدر entropy فيزيائيّ، والتصميم يفترض validation / health test→ تصميم يملك مصدر أرقام عشوائيّة حقيقيّةيستدعي واجهة RNG الآمنة في نظام التشغيل→ في الغالب هجينentropy فيزيائيّ + CSPRNG
7.3. ثمّ البحث عن عيوب واضحة بالاختبار الإحصائيّ
الاختبار الإحصائيّ ليس بلا حاجة. بل هو مهمّ. غير أنّ دوره أقرب إلى كشف العيوب منه إلى الإثبات.
نموذجيًّا تُنظر زوايا كهذه.
- انحياز 0 و 1
- انحياز الـ run
- الدوريّة
- الارتباط
- entropy التقريبيّ
- التعقيد الخطّيّ
كثيرًا ما يُرجع إلى NIST SP 800-22، وداخل اليابان إلى الحدّ الأدنى لمجموعة اختبار الأرقام العشوائيّة في CRYPTREC. هذه فعّالة لفحص هل في المتتالية انحياز أو بنية غريبة.
غير أنّ النجاح هنا لا يعني أرقامًا عشوائيّة حقيقيّة. CSPRNG المصنوع بإتقان يجتاز عادة، والعكس: مصدر فيزيائيّ قد يسقط بسبب انحياز المستشعر أو عطله.
موقع الاختبار تقريبًا كالآتي.
- اجتياز: العيب الفاضح يصعب رؤيته في الوقت الحاليّ
- سقوط: احتمال أنّ شيئًا غير سليم مرتفع
- إذن يمكن إثبات أنّه حقيقيّ: لا يُقال ذلك
7.4. في الاستخدام الأمنيّ، انظر بعين المهاجم
في استخدام مثل رمز إعادة تعيين كلمة المرور، ومعرّف الجلسة، و nonce، وتوليد المفاتيح، السؤال هل هو حقيقيّ وحده لا يكفي.
ما ينبغي النظر إليه فعلًا هو هل يستطيع المهاجم التنبّؤ بالقيمة التالية.
مثلًا،
- الزرع من الوقت الحاليّ وحده
- مجرّد خلط معرّف العمليّة أو رقم تسلسليّ
- تنفيذ ذاتيّ من دون تقييم جودة الـ seed
- صرف واجهة عائلة
randomإلى استخدام أمنيّ
هذا لا يُمنَع بـ المظهر مقنع وحده.
نكتب ما يحدث تحديدًا في مثال واحد.
افرض أنّ رمز إعادة تعيين كلمة المرور يُصنع بـ PRNG مزروع من الوقت الحاليّ. يطلب المهاجم أوّلًا إعادة إصدار لحسابه، فيحصل على رمز واحد. إن عُرف الرمز ووقت الطلب، ضاقت مرشّحات الـ seed إلى بضع ثوانٍ حوله. بعد ذلك يكفي تشغيل الخوارزميّة نفسها لكلّ مرشّح، وتجربة القيم التي تخرج كرمز للهدف بالترتيب.
هنا لم يكسر المهاجم التشفير. أعاد إنتاج المولّد لديه فحسب. ولا علاقة لاجتياز تلك المتتالية للاختبار الإحصائيّ. في اللحظة التي يمكن فيها عدّ مرشّحات الـ seed، تلك القيمة ليست أرقامًا عشوائيّة بالنسبة إلى المهاجم.
ينطبق الكلام نفسه على معرّف الجلسة، ورمز الدعوة، وكلمة المرور لمرّة واحدة، واسم ملفّ مؤقّت يُوضع في مجلّد عامّ. ما لا تستطيع الجزم بأنّ التخمين لا يضرّ كثيرًا ينبغي صنعه كلّه على جانب RNG الآمن.
توصي IPA أيضًا بمعرفة واجهات الأمن والمكتبات القائمة، وتجنّب التنفيذ الذاتيّ المتسرّع. في Python يُنصّ على تقديم وحدة secrets على random. في Java الموقع نفسه لـ SecureRandom.
في النهاية، في الأمن شبه عشوائيّ أم حقيقيّ أقلّ أهمّيّة من هل تُستخدم seed / entropy آمنة وواجهة آمنة.
8. أيّها يُستخدم حسب الغرض
| الغرض | المناسب | السبب |
|---|---|---|
| المحاكاة، Monte Carlo، منطق الألعاب | PRNG عاديّ | سريع ويمكن إعادته بالـ seed |
| إعادة الاختبار، إعادة الخلل | PRNG عاديّ | يمكن إعادة الإدخال نفسه |
| المفاتيح، الرموز، nonce، معرّف الجلسة | CSPRNG / واجهة RNG الآمنة في نظام التشغيل | يلزم صعوبة التنبّؤ |
| تغذية الـ seed، سحب ثقيل التدقيق أو المسؤوليّة التوضيحيّة | تصميم يملك مصدرًا فيزيائيًّا، أو آليّة قابلة للتدقيق | entropy الفيزيائيّ أو الأثر مهمّ |
تطوير تطبيق عامّ يحتاج أرقامًا عشوائيّة آمنة |
RNG الآمن القياسيّ لنظام التشغيل / اللغة | أصعب انحرافًا من التنفيذ الذاتيّ |
الاختيار الهادئ على مستوى التنفيذ كالآتي.
- Windows الأصليّ:
BCryptGenRandom - .NET:
System.Security.Cryptography.RandomNumberGenerator - Linux:
getrandom() - Python:
secrets - Java:
SecureRandom
تشرح Microsoft Learn أنّ BCryptGenRandom في Windows يستخدم موفّرًا افتراضيًّا يمتثل لـ CTR_DRBG في NIST SP800-90. وgetrandom() في Linux موثَّق بأنّ بايتات الأرقام العشوائيّة تصلح لـ cryptographic purposes. كذلك RandomNumberGenerator في .NET و secrets في Python و SecureRandom في Java واجهات تراعي الاستخدام التشفيريّ.
8.1. أصغر أمثلة استخدام
القائمة وحدها لا تحرّك اليد، لذلك نضع الشكل الفعليّ لاثنين تمثيليّين فقط. المشترك أنّك لا تجهّز الـ seed بنفسك. تدبير الـ seed عمل الواجهة.
في C# (.NET 8) تُستخدم الدوالّ الساكنة لـ System.Security.Cryptography.RandomNumberGenerator.
using System;
using System.Security.Cryptography;
// 0 以上 100 未満の整数を、偏りなく取る
int n = RandomNumberGenerator.GetInt32(0, 100);
// トークン用に 32 バイト取り、URL に載せられる文字列にする
byte[] bytes = RandomNumberGenerator.GetBytes(32);
string token = Convert.ToBase64String(bytes)
.Replace('+', '-')
.Replace('/', '_')
.TrimEnd('=');
سبب استخدام GetInt32 أنّ «قسمة البايتات على النطاق وأخذ الباقي» يجعل القيم عند الطرف أسهل ظهورًا. حين يلزم تعيين النطاق، استخدم هذا بدل أخذ الباقي بنفسك.
في Python (3.6 فما بعد) الوحدة هي secrets.
import secrets
# URL に載せられる安全なトークン
token = secrets.token_urlsafe(32)
# 0 以上 100 未満の整数
n = secrets.randbelow(100)
للمقابلة، الكتابة الآتية لا تُستخدم للغرض نفسه.
import random
# NG: random は再現性のための PRNG で、セキュリティ用途向けではない
token = "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=32))
random و secrets كلاهما يعيد سلسلة تبدو متبعثرة. الفرق ليس المخرجات بل من أين جاءت الأرقام العشوائيّة. random هو PRNG يركّز على قابليّة الإعادة ويستخدم Mersenne Twister، ووثائق Python الرسميّة توجّه إلى استخدام secrets لإدارة الأسرار.
9. سوء فهم شائع
9.1. اجتياز الاختبار الإحصائيّ يعني أنّها أرقام عشوائيّة حقيقيّة
لا. ما يقال هو تقريبًا يصعب رؤية انحياز فاضح.
9.2. إن كانت أرقامًا عشوائيّة حقيقيّة فهي آمنة دائمًا
لا. عطل المصدر الفيزيائيّ، والانحياز، وخلل التنفيذ، وغياب health test تُفسد الجودة.
9.3. الأرقام شبه العشوائيّة كلّها خطرة
لا. CSPRNG / DRBG هو في الواقع نواة واجهات الأرقام العشوائيّة الآمنة في الممارسة.
9.4. في الاستخدام الأمنيّ ينبغي استخدام العشوائيّة الفيزيائيّة الخام مباشرة فقط
ليس بالضرورة. في الواقع الشائع هو توليفة مصدر entropy فيزيائيّ + CSPRNG.
9.5. random أو Math.random() يتبعثر بما يكفي فيصلح للرمز
الغرض مختلف. تبعثر المظهر وصعوبة التنبّؤ من المهاجم أمران منفصلان.
10. جدول حكم عند التردّد في الممارسة
ترتيب التفكير عند التردّد كالآتي.
- هل تريد إعادة النتيجة نفسها
- نعم → PRNG عاديّ
- لا → التالي
- هل يضرّ تنبّؤ المهاجم
- نعم → RNG الآمن القياسيّ لنظام التشغيل / اللغة
- لا → اختر بجودة المتطلّب والسرعة
- هل تلزم مسؤوليّة توضيحيّة أو تدقيق لمصدر الأرقام العشوائيّة نفسه
- نعم → انظر في مصدر فيزيائيّ أو خدمة مصادَق عليها
- هل تريد تنفيذًا ذاتيًّا
- النية مفهومة، لكنّ الأرقام العشوائيّة سهلة الانحراف، فاستخدم الواجهة القياسيّة أوّلًا
بهذا الترتيب يُحسم الاتّجاه أسرع بكثير من الحيرة في ثنائيّة شبه أم حقيقيّ وحدها.
11. الخلاصة
إن قيل فرق شبه العشوائيّ والحقيقيّ بأخشن شكل ينفع في العمل، فكالآتي.
- شبه العشوائيّ يُصنع بالحساب
- الحقيقيّ يأخذ entropy من ظاهرة فيزيائيّة
- لكنّ واجهة الأرقام العشوائيّة الآمنة في الممارسة بطلها
entropy source + CSPRNGفي المنتصف
أي أنّ ما يُنظر إليه ليس المظهر بل التكوين.
- لا يمكن الجزم من المخرجات وحدها بأنّها حقيقيّة
- الاختبار الإحصائيّ ينفع في كشف العيوب ولا يصلح إثباتًا
- في الأمن اللبّ هو
هل يمكن التنبّؤ - إن لزمت قابليّة الإعادة فـ PRNG، وإن لزمت صعوبة التنبّؤ فواجهة RNG الآمنة القياسيّة لنظام التشغيل / اللغة
بهذا الترتيب تخرج من مقابلة خشنة هي هل شبه العشوائيّ مزيف.
12. المراجع
-
NIST SP 800-90A Rev. 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators الوثيقة الأساسيّة لـ deterministic random bit generator.
-
NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation ترتّب تفكير مصدر entropy و validation و health testing.
-
NIST SP 800-90C: Recommendation for Random Bit Generator (RBG) Constructions ترتّب تكوين
entropy source + DRBG. -
NIST SP 800-22 Rev. 1a: A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications يشرح موقع الاختبار الإحصائيّ. المهمّ أنّ الاختبار خطوة أولى وليس إثباتًا.
-
NIST Glossary: Non-deterministic Random Bit Generator (NRBG) يصلح للتحقّق من مصطلح NIST القريب من
true random. -
RFC 4086: Randomness Requirements for Security ترتّب تنبيهات الأرقام العشوائيّة ومصدر entropy في الاستخدام الأمنيّ.
-
Microsoft Learn: BCryptGenRandom function يشرح واجهة RNG الآمنة في Windows و
CTR_DRBGللموفّر الافتراضيّ. -
Linux man page: getrandom(2) واجهة أرقام عشوائيّة في Linux تصلح لـ
cryptographic purposes. -
Microsoft Learn: RandomNumberGenerator Class واجهة RNG عالية القوّة التشفيريّة في .NET.
-
Python documentation: secrets — Generate secure random numbers for managing secrets الأساس للتعامل مع أرقام عشوائيّة للأغراض الأمنيّة في Python.
-
Oracle Java Documentation: SecureRandom يجمع تفكير RNG الآمن و seed / entropy في Java.
-
IPA: 第3章 3.破られにくい暗号技術と擬似乱数の使用 ترتّب باليابانيّة أهمّيّة الـ seed والاختبار وتنبيهات استخدام الواجهة.
مقالات ذات صلة
أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.
اختيار حساب خدمة ويندوز — LocalSystem والحسابات الافتراضية وgMSA
هل ما زلت تشغّل خدمات ويندوز بحساب LocalSystem؟ تقارن هذه المقالة الامتيازات وهويّة الشبكة لـ LocalService وNetworkService والحسابات الاف...
سياسة تدقيق أمن Windows وتحقيق سجلّ الأحداث عمليّاً ── لتصبح نظم المعلومات قادرة على قراءة 4625
دليل عمليّ للإجابة عن «حقِّق في سجلّات فشل تسجيل الدخول». يغطي علاقة سياسة التدقيق الأساسيّة والمفصَّلة، والفئات الفرعيّة التي ينبغي تفعي...
لماذا أصبح Windows على هذا الشكل الآن: تطوّر إصدارات Windows عبر التاريخ من منظور المطوّر
نرتّب التغيّرات من Windows 95 إلى Windows 11، لا كجدول زمنيّ للمظهر، بل من منظور مطوّر تطبيقات Windows: التوافق، والاستقرار، وإدارة الصلا...
إجراء عمليّ لتمييز طريقة الـ hash من تمثيلها النصّيّ
عند تمييز طريقة سلسلة hash متبقّية في السجلّات أو في DB، يسهل الترتيب إن نظرت إلى الـ prefix ثمّ الفواصل ثمّ مجموعة المحارف ثمّ الطول. ال...
آليّة حلّ أسماء DLL في Windows - ترتيب البحث وSxS
نرتّب حلّ أسماء DLL في Windows عمليّاً، حتى أثر DLL search order وKnown DLLs وloaded-module list وAPI set ومانيفست SxS وواجهات LoadLibrary.
أين يتصل هذا الموضوع
ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.
الاستشارات التقنية ومراجعة التصميم
إذا أردت ترتيب كيفيّة الفصل بين قابليّة إعادة الإنتاج المطلوبة للمحاكاة وصعوبة التنبّؤ المطلوبة للأمان، بدءاً من اختيار واجهة برمجة الأرقام العشوائيّة وتصميم البذرة seed، فهو موضوع يسهل تناوله ضمن الاستشارة التقنيّة ومراجعة التصميم.
الأسئلة الشائعة
أسئلة شائعة حول موضوع هذه المقالة.
- ما الفرق بين الأرقام شبه العشوائيّة والأرقام العشوائيّة الحقيقيّة؟
- الأرقام شبه العشوائيّة (PRNG) متتالية تُصنع حتميًّا بالخوارزميّة من seed وحالة داخليّة، فتخرج المتتالية نفسها بالشروط نفسها. الأرقام العشوائيّة الحقيقيّة متتالية مصدر entropy فيها ظاهرة فيزيائيّة مثل الضجيج الحراريّ أو jitter المهتزّ، وإعادة الأخذ بالشروط نفسها نادرًا ما تعيد قيم المتتالية نفسها. غير أنّ معظم واجهات الأرقام العشوائيّة الآمنة المستخدمة عمليًّا لا تعيد العشوائيّة الفيزيائيّة كما هي، بل تكوين هجين يعيد CSPRNG / DRBG مزروعًا من مصدر entropy فيزيائيّ.
- هل يمكن التمييز بين شبه العشوائيّ والحقيقيّ بالنظر إلى المخرجات؟
- لا يمكن الجزم من متتالية مخرجات محدودة بأنّها أرقام عشوائيّة حقيقيّة. يمكن دائمًا بناء برنامج حتميّ يعيد المتتالية المرصودة نفسها تمامًا. عند التمييز، جوهر الأمر ليس شكل المخرجات بل تكوين المولّد: ما خوارزميّة التوليد، من أين يأتي الـ seed، هل يُعاد الزرع، هل يوجد تحقّق من مصدر entropy (تقييم min-entropy و health test)، وأيّ واجهة تُستخدم.
- هل اجتياز الاختبار الإحصائيّ يعني أنّها أرقام عشوائيّة حقيقيّة؟
- لا. دور الاختبار الإحصائيّ أقرب إلى كشف العيوب منه إلى الإثبات. حتّى NIST SP 800-22 يعدّ الاختبار خطوة أولى، لا إثباتًا مطلقًا لصلاحية المولّد. CSPRNG المصنوع بإتقان يجتاز الاختبار عادة، والعكس: مصدر فيزيائيّ قد يسقط بسبب انحياز المستشعر أو عطله. الاجتياز يعني أنّ العيب الفاضح يصعب رؤيته، والسقوط يعني أنّ شيئًا على الأرجح غير سليم.
- أيّ واجهة أرقام عشوائيّة تُستخدم في الأغراض الأمنيّة؟
- للمفاتيح والرموز و nonce ومعرّفات الجلسة، الأساس استخدام واجهة آمنة يوفّرها نظام التشغيل أو اللغة. تحديدًا: BCryptGenRandom على Windows الأصليّ، System.Security.Cryptography.RandomNumberGenerator في .NET، getrandom() على Linux، وحدة secrets في Python، SecureRandom في Java. تجنّب التنفيذ الذاتيّ المزروع من الوقت الحاليّ أو معرّف العمليّة، وتجنّب صرف واجهات عائلة random إلى استخدام أمنيّ.
الملف الشخصي للمؤلف
صفحة الملف الشخصي لمؤلف المقالة.
غو كومورا
مؤسّس شركة كومورا سوفت ذ.م.م.
يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.