random(4)

الاسم
random، urandom - أجهزة مصدر الأرقام العشوائية في النواة

موجز
#include <linux/random.h>

int ioctl(fd, RNDrequest, param);

الوصف
توفر ملفات المحارف الخاصة /dev/random و /dev/urandom (الموجودة منذ لينكس 1.3.30) واجهة لمولد الأرقام العشوائية في النواة. يحمل الملف /dev/random رقم الجهاز الرئيس 1 ورقم الجهاز الفرعي 8. ويحمل الملف /dev/urandom رقم الجهاز الرئيس 1 ورقم الجهاز الفرعي 9.

يجمع مولد الأرقام العشوائية الضجيج البيئي من وسائط الأجهزة والمصادر الأخرى في مجمع اعتلاج (entropy pool). ويحتفظ المولد أيضاً بتقدير لعدد بتات الضجيج في مجمع الاعتلاج. ومن مجمع الاعتلاج هذا، تُنشأ الأرقام العشوائية.

يوفر لينكس 3.17 وما يليه واجهة getrandom(2) الأبسط والأكثر أماناً والتي لا تتطلب ملفات خاصة؛ انظر صفحة دليل getrandom(2) للتفاصيل.

عند القراءة منه، يعيد الجهاز /dev/urandom بايتات عشوائية باستخدام مولد أرقام عشوائية زائفة يُبذر من مجمع الاعتلاج. القراءات من هذا الجهاز لا تُعطّل (أي لا يُتخلى عن المعالج)، ولكنها قد تسبب تأخيراً ملحوظاً عند طلب كميات كبيرة من البيانات.

عند القراءة منه أثناء وقت الإقلاع المبكر، قد يعيد /dev/urandom بيانات قبل تهيئة مجمع الاعتلاج. إذا كان هذا الأمر يهم تطبيقك، فاستخدم getrandom(2) أو /dev/random بدلاً منه.

جهاز /dev/random هو واجهة موروثة تعود إلى وقت لم تكن فيه البدائيات التعموية المستخدمة في تنفيذ /dev/urandom موثوقة على نطاق واسع. سيعيد بايتات عشوائية فقط ضمن العدد المقدر لبتات الضجيج الحديثة في مجمع الاعتلاج، مع التعطيل إذا لزم الأمر. يعد /dev/random مناسباً للتطبيقات التي تحتاج إلى عشوائية عالية الجودة، ويمكنها تحمل تأخيرات غير محددة.

عندما يكون مجمع الاعتلاج فارغاً، ستُعطل القراءات من /dev/random حتى يُجمع ضجيج بيئي إضافي. منذ لينكس 5.6، يُتجاهل علم O_NONBLOCK حيث لن يُعطل /dev/random بعد الآن إلا أثناء عملية الإقلاع المبكر. في الإصدارات السابقة، إذا استُدعي open(2) لـ /dev/random مع علم O_NONBLOCK، فإن read(2) اللاحق لن يُعطل إذا لم يكن عدد البايتات المطلوب متاحاً. وبدلاً من ذلك، تُعاد البايتات المتاحة. إذا لم يتوفر أي بايت، سيعيد read(2) القيمة -1 ويُضبط errno إلى EAGAIN.

ليس لعلم O_NONBLOCK أي تأثير عند فتح /dev/urandom. عند استدعاء read(2) للجهاز /dev/urandom، ستعيد القراءات التي تصل إلى 256 بايت نفس عدد البايتات المطلوبة ولن يُقاطعها معالج إشارات. قد تعيد القراءات بمخزن مؤقت يتجاوز هذا الحد عدداً أقل من البايتات المطلوبة أو تفشل بالخطأ EINTR، إذا قاطعها معالج إشارات.

منذ لينكس 3.16، سيعيد read(2) من /dev/urandom في أقصى حد 32 ميجابايت. سيعيد read(2) من /dev/random في أقصى حد 512 بايت (340 بايت قبل لينكس 2.6.12).

ستحدث الكتابة إلى /dev/random أو /dev/urandom مجمع الاعتلاج بالبيانات المكتوبة، لكن هذا لن يؤدي إلى تعداد اعتلاج أعلى. هذا يعني أنها ستؤثر على المحتويات المقروءة من كلا الملفين، لكنها لن تجعل القراءات من /dev/random أسرع.

  الاستخدام
تُعد واجهة /dev/random واجهة موروثة، ويُفضل /dev/urandom وهو كافٍ في جميع حالات الاستخدام، باستثناء التطبيقات التي تتطلب عشوائية أثناء وقت الإقلاع المبكر؛ لهذه التطبيقات، يجب استخدام getrandom(2) بدلاً من ذلك، لأنه سيُعطل حتى يُهيأ مجمع الاعتلاج.

إذا حُفظ ملف البذرة عبر عمليات إعادة التشغيل كما هو موصى به أدناه، فسيكون الناتج آمناً تعموياً ضد المهاجمين الذين لا يملكون وصول جذر محلي بمجرد إعادة تحميله في تسلسل الإقلاع، وهو مناسب تماماً لمفاتيح جلسات تعمية الشبكة. (قامت جميع توزيعات لينكس الرئيسة بحفظ ملف البذرة عبر عمليات إعادة التشغيل منذ عام 2000 على الأقل.) نظراً لأن القراءات من /dev/random قد تُعطل، سيرغب المستخدمون عادةً في فتحه في وضع عدم التعطيل (أو إجراء قراءة بمهلة زمنية)، وتقديم نوع من إشعار للمستخدم إذا لم يكن الاعتلاج المطلوب متاحاً على الفور.

  الضبط
إذا لم يكن نظامك يحتوي على /dev/random و /dev/urandom منشأين بالفعل، فيمكن إنشاؤهما بالأوامر التالية:

    mknod -m 666 /dev/random c 1 8
    mknod -m 666 /dev/urandom c 1 9
    chown root:root /dev/random /dev/urandom

عندما يبدأ نظام لينكس دون الكثير من تفاعل المشغل، قد يكون مجمع الاعتلاج في حالة يمكن التنبؤ بها إلى حد كبير. يقلل هذا من الكمية الفعلية للضجيج في مجمع الاعتلاج عن التقدير. ومن أجل مواجهة هذا التأثير، يساعد حمل معلومات مجمع الاعتلاج عبر عمليات الإغلاق وبدء التشغيل. للقيام بذلك، أضف السطور إلى نص برمجي مناسب يُشغل أثناء تسلسل بدء تشغيل نظام لينكس:

    echo "جاري تهيئة مولد الأرقام العشوائية..."
    random_seed=/var/run/random-seed
    # حمل بذرة عشوائية من بدء تشغيل لآخر
    # حمل ثم احفظ مجمع الاعتلاج بالكامل
    if [ -f $random_seed ]; then
        cat $random_seed >/dev/urandom
    else
        touch $random_seed
    fi
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
    bytes=$(expr $bits / 8)
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

أيضاً، أضف السطور التالية في نص برمجي مناسب يُشغل أثناء إغلاق نظام لينكس:

    # حمل بذرة عشوائية من الإغلاق إلى بدء التشغيل
    # احفظ مجمع الاعتلاج بالكامل
    echo "جاري حفظ البذرة العشوائية..."
    random_seed=/var/run/random-seed
    touch $random_seed
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
    bytes=$(expr $bits / 8)
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

نفترض في الأمثلة أعلاه وجود لينكس 2.6.0 أو أحدث، حيث يعيد /proc/sys/kernel/random/poolsize حجم مجمع الاعتلاج بالبتات (انظر أدناه).

  واجهات /proc
توفر الملفات في الدليل /proc/sys/kernel/random (الموجودة منذ لينكس 2.3.16) معلومات إضافية حول جهاز /dev/random:

entropy_avail
    يعطي هذا الملف المخصص للقراءة فقط الاعتلاج المتاح، بالبتات. سيكون هذا رقماً في النطاق من 0 إلى 4096.

poolsize
    يعطي هذا الملف حجم مجمع الاعتلاج. تختلف دلالات هذا الملف عبر إصدارات النواة:

    لينكس 2.4:
        يعطي هذا الملف حجم مجمع الاعتلاج بـ البايتات. عادةً، سيتضمن هذا الملف القيمة 512، لكنه قابل للكتابة، ويمكن تغييره إلى أي قيمة تتوفر لها خوارزمية. الخيارات هي 32، 64، 128، 256، 512، 1024، أو 2048.

    لينكس 2.6 وما يليه:
        هذا الملف للقراءة فقط، ويعطي حجم مجمع الاعتلاج بـ البتات. ويحتوي على القيمة 4096.

read_wakeup_threshold
    يحتوي هذا الملف على عدد بتات الاعتلاج المطلوبة لإيقاظ العمليات التي تنام بانتظار الاعتلاج من /dev/random. المبدئي هو 64.

write_wakeup_threshold
    يحتوي هذا الملف على عدد بتات الاعتلاج التي تحتها نوقظ العمليات التي تجري select(2) أو poll(2) للوصول بالكتابة إلى /dev/random. يمكن تغيير هذه القيم عن طريق الكتابة في الملفات.

uuid
boot_id
    تحتوي هذه الملفات المخصصة للقراءة فقط على سلاسل عشوائية مثل 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. يُنشأ الأول من جديد لكل قراءة، بينما أُنشئ الأخير مرة واحدة.

  واجهة ioctl(2)
طلبات ioctl(2) التالية معرفة على واصفات الملفات المتصلة بـ /dev/random أو /dev/urandom. ستتفاعل جميع الطلبات المنفذة مع مجمع اعتلاج المدخلات مما يؤثر على كل من /dev/random و /dev/urandom. مطلوب قدرة CAP_SYS_ADMIN لجميع الطلبات باستثناء RNDGETENTCNT.

RNDGETENTCNT
    استرجع تعداد الاعتلاج لمجمع المدخلات، ستكون المحتويات هي نفسها ملف entropy_avail تحت proc. ستُخزن النتيجة في العدد الصحيح (int) الذي يشير إليه المعطى.

RNDADDTOENTCNT
    زد أو أنقص تعداد اعتلاج مجمع المدخلات بالقيمة التي يشير إليها المعطى.

RNDGETPOOL
    أُزيل في لينكس 2.6.9.

RNDADDENTROPY
    أضف بعض الاعتلاج الإضافي لمجمع المدخلات، مع زيادة تعداد الاعتلاج. يختلف هذا عن الكتابة إلى /dev/random أو /dev/urandom، والتي تضيف فقط بعض البيانات ولكنها لا تزيد تعداد الاعتلاج. تُستخدم البنية التالية:

        struct rand_pool_info {
            int    entropy_count;
            int    buf_size;
            __u32  buf[0];
        };

    هنا entropy_count هي القيمة المضافة إلى (أو المنقوصة من) تعداد الاعتلاج، و buf هو المخزن المؤقت بحجم buf_size الذي يُضاف إلى مجمع الاعتلاج.

RNDZAPENTCNT
RNDCLEARPOOL
    صفر تعداد اعتلاج جميع المجمعات وأضف بعض بيانات النظام (مثل ساعة الحائط) إلى المجمعات.

الملفات
/dev/random
/dev/urandom

ملاحظات
للحصول على نظرة عامة ومقارنة للواجهات المختلفة التي يمكن استخدامها للحصول على العشوائية، راجع random(7).

العلل
أثناء وقت الإقلاع المبكر، قد تعيد القراءات من /dev/urandom بيانات قبل تهيئة مجمع الاعتلاج.

انظر أيضًا
mknod(1), getrandom(2), random(7)

RFC 1750, "Randomness Recommendations for Security"

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.