مولد اعداد تصادفی - فوری، رایگان و واقعاً تصادفی
مولد اعداد تصادفی چیست؟
مولد اعداد تصادفی (RNG) سیستمی است - محاسباتی، فیزیکی یا ترکیبی - که دنباله ای از اعداد را تولید میکند که نمیتوان آنها را بهتر از شانس پیشبینی کرد. هر مقدار خروجی از نظر آماری مستقل از مقادیر قبل از آن است و دنباله کامل هیچ الگوی قابل تشخیصی را نشان نمیدهد که یک ناظر بتواند از آن برای حدس زدن خروجیهای آینده استفاده کند. این تعریف ساده به نظر میرسد، اما دستیابی به آن در عمل یکی از مشکلات سختتر در ریاضیات کاربردی و علوم کامپیوتر است.
عبارت «مولد اعداد تصادفی» دو چیز اساساً متفاوت را پوشش میدهد که اغلب با هم اشتباه گرفته میشوند: مولدهای اعداد شبهتصادفی (PRNG) که از الگوریتمهای قطعی برای تولید توالیهایی استفاده میکنند که صرفاً تصادفی به نظر میرسند، و مولدهای اعداد تصادفی واقعی (TRNG) که آنتروپی فیزیکی واقعی را از جهان برداشت میکنند. دسته سوم، مولدهای اعداد شبهتصادفی با امنیت رمزنگاری (CSPRNG) ، بین این دو قرار میگیرد - در پیادهسازی قطعی هستند اما به گونهای طراحی شدهاند که هیچ حمله محاسباتی امکانپذیری نمیتواند خروجی آنها را از تصادفی بودن واقعی تشخیص دهد.
چرا مولدهای اعداد تصادفی اهمیت دارند؟
RNGها زیرساختهای تحمل بار در حوزههای علمی، امنیتی و نرمافزارهای روزمره هستند. بدون تصادفی بودن قابل اعتماد، رمزنگاری مدرن از هم میپاشد: هر جلسه TLS، هر پیام رمزگذاری شده، هر امضای دیجیتال به کلیدهای مخفی وابسته است که باید غیرقابل پیشبینی باشند. کازینوها، بختآزماییها و بازیهای آنلاین برای عدالت به RNGها وابستهاند. شبیهسازیهای علمی - از مدلسازی آب و هوا گرفته تا کشف دارو - از نمونهگیری تصادفی برای راهحلهای تقریبی استفاده میکنند که از نظر تحلیلی غیرقابل حل هستند. نمونهگیری آماری، آزمایش A/B، تولید دنیای بازی رویهای و حتی مقداردهی اولیه وزن شبکه عصبی، همگی به اعداد تصادفی با کیفیت بالا نیاز دارند.
عواقب تصادفی بودن بد، شدید و مستند است. در سال ۲۰۱۲، محققان کشف کردند که میلیونها کلید عمومی RSA در اینترنت، فاکتورهای اول مشترکی دارند، زیرا دستگاههایی که آنها را تولید کردهاند، در زمان بوت، آنتروپی کافی ندارند. مهاجمی که یک عدد اول مشترک را فاکتورگیری میکند، میتواند کلید خصوصی را بازیابی کرده و تمام ارتباطات را رمزگشایی کند. در سال ۲۰۱۰، سونی پلیاستیشن ۳ به دلیل استفاده مجدد پیادهسازی ECDSA از همان نانس «تصادفی» برای هر امضا، دچار مشکل شد - یک مقدار تکراری برای استخراج جبری کلید خصوصی کافی است. اینها موارد حاشیهای نیستند؛ آنها نتیجه قابل پیشبینی برخورد با تصادفی بودن به عنوان یک مسئله حل شده هستند.
دامنههای کاربردی کلیدی
- رمزنگاری و امنیت: تولید کلید، بردارهای مقداردهی اولیه، نانسها، سالتها، توکنهای جلسه و شماره سریالهای گواهی.
- شبیهسازیها و مدلسازی: روشهای مونت کارلو، معادلات دیفرانسیل تصادفی، شبیهسازیهای فیزیک ذرات، مدلهای اپیدمیولوژیک.
- بازی و قمار: بر زدن کارتها، انداختن تاس، نتایج دستگاههای اسلات، تولید مراحل رویهای، میزهای غنیمت.
- آمار و پژوهش: نمونهگیری تصادفی، کارآزماییهای تصادفی کنترلشده، بوتاسترپ، تقسیمبندیهای اعتبارسنجی متقابل.
- سیستمهای توزیعشده: انتخاب رهبر، متعادلسازی بار با لرزش، قطع نمایی با تأخیرهای تصادفی.
- یادگیری ماشین: مقداردهی اولیه وزن، ماسکهای حذف، افزایش داده، گرادیان نزولی تصادفی.
نحوه کار مولد اعداد شبه تصادفی
یک PRNG با یک سید (seed) - یک عدد یا بلوک کوچک از دادهها - شروع میشود و یک تابع ریاضی قطعی را به طور مکرر اعمال میکند تا یک دنباله طولانی از خروجیها تولید کند. با داشتن سید یکسان، دنباله کاملاً قابل تکرار است. با داشتن سید متفاوت، دنباله کاملاً متفاوت به نظر میرسد. کیفیت یک PRNG با این قضاوت میشود که چقدر خوب از آزمونهای آماری برای تصادفی بودن عبور میکند و برای کاربردهای امنیتی، آیا میتوان وضعیت داخلی آن را از خروجیهایش استنباط کرد یا خیر.
ژنراتورهای خطی همنهشت
قدیمیترین و سادهترین خانواده PRNG از تابع بازگشتی X n+1 = (aX n + c) mod m استفاده میکند، که در آن a، c و m ثابتهایی با دقت انتخاب شدهاند. تابع rand() کتابخانه استاندارد C در بسیاری از پیادهسازیها، یک مولد خطی همنهشت (LCG) است. پیادهسازی LCGها سریع و آسان است، اما نقاط ضعف جدی دارند: چرخه بیتهای مرتبه پایین با دورههای کوتاه، دوره توالی کامل حداکثر m است و حالت داخلی به طور جزئی از چند خروجی قابل بازیابی است. آنها برای شبیهسازیها و بازیهای ساده بدون نیاز به امنیت قابل قبول هستند و برای هر چیز رمزنگاری کاملاً غیرقابل قبول هستند.
مرسن تویستر
تابع Mersenne Twister (MT19937) که توسط ماتسوموتو و نیشیمورا در سال ۱۹۹۸ منتشر شد، به PRNG پیشفرض در پایتون، روبی، R، PHP و بسیاری از زبانهای دیگر تبدیل شد. این تابع دوره تناوب ۲ ۱۹۹۳۷ -۱ (به طور نجومی بزرگ) دارد، تقریباً از تمام آزمونهای آماری عبور میکند و به سرعت اجرا میشود. حالت داخلی آن ۶۲۴ عدد صحیح ۳۲ بیتی است. نقطه ضعف مهم: اگر یک مهاجم ۶۲۴ خروجی متوالی را مشاهده کند، میتواند حالت داخلی کامل را بازسازی کرده و هر خروجی آینده را پیشبینی کند. بنابراین، Mersenne Twister برای هیچ برنامه حساس به امنیت کاملاً نامناسب است، با وجود اینکه به طور گسترده در این نقش مورد سوءاستفاده قرار میگیرد.
PRNG های مدرن: Xoshiro، PCG و SFC
PRNGهای غیررمزنگاریِ برتر فعلی شامل خانواده PCG (مولدهای Permuted Congruential)، xoshiro256** و SFC64 هستند. این مولدها کوچکتر، سریعتر و از نظر آماری برتر از Mersenne Twister هستند. PCG به طور خاص عملکرد بسیار خوبی روی باتری TestU01 BigCrush دارد - که سختگیرانهترین مجموعه تست آماری استاندارد برای PRNGها است. NumPy دقیقاً به همین دلیل مولد پیشفرض خود را در نسخه 1.17 از Mersenne Twister به PCG64 تغییر داد.
نحوه کار یک PRNG امن رمزنگاری شده
یک CSPRNG باید دو ویژگی فراتر از تصادفی بودن آماری معمولی را برآورده کند. اول، غیرقابل پیشبینی بودن بیت بعدی : با توجه به تمام خروجیهای قبلی، هیچ الگوریتم زمان چندجملهای نمیتواند بیت بعدی را با احتمالی به طور معنیداری بزرگتر از 50٪ پیشبینی کند. دوم، مقاومت در برابر سازش وضعیت : اگر یک مهاجم وضعیت داخلی فعلی را یاد بگیرد، نمیتواند خروجیهای گذشته را بازسازی کند (این امر به عنوان محرمانگی معکوس یا مقاومت در برابر ردیابی معکوس شناخته میشود).
سیستم عاملهای مدرن CSPRNGها را به عنوان یک سرویس اصلی ارائه میدهند. لینوکس فراخوانی سیستمی /dev/urandom و getrandom() را ارائه میدهد که هر دو از یک مخزن آنتروپی هسته که توسط رویدادهای سختافزاری ایجاد شده است، استفاده میکنند. ویندوز BCryptGenRandom() را ارائه میدهد. macOS و iOS از arc4random_buf() استفاده میکنند که از macOS 10.12 توسط ChaCha20 پشتیبانی میشود. ساختارهای اساسی مورد استفاده در CSPRNGهای تولیدی شامل Hash_DRBG ، HMAC_DRBG و CTR_DRBG (که همگی در NIST SP 800-90A استاندارد شدهاند) و همچنین مولدهای مبتنی بر ChaCha20 هستند که توسط BSDها و لینوکس مدرن استفاده میشوند.
چگونه یک مولد اعداد تصادفی واقعی کار میکند
یک TRNG تصادفی بودن را از فرآیندهای فیزیکی که واقعاً غیرقابل پیشبینی هستند، استخراج میکند - یا به این دلیل که اساساً مکانیک کوانتومی هستند یا به این دلیل که شامل سیستمهای کلاسیک آشوبناک حساس به شرایط اولیه غیرقابل اندازهگیری هستند.
منابع رایج آنتروپی فیزیکی
- نویز حرارتی (نویز جانسون-نایکوئیست): حرکت تصادفی الکترونها در یک مقاومت، نوسانات ولتاژی ایجاد میکند که میتوان آنها را نمونهبرداری و دیجیتالی کرد.
- نویز ضربهای: ورود گسسته و تصادفی فوتونها یا الکترونها به یک آشکارساز، یک سیگنال تصادفی قابل اندازهگیری تولید میکند.
- واپاشی رادیواکتیو: زمانبندی رویدادهای واپاشی از یک منبع رادیواکتیو واقعاً تصادفی کوانتومی است. RANDOM.ORG از نویز رادیویی جوی استفاده میکند که به طور مشابه غیرقابل پیشبینی است.
- منابع نوری کوانتومی: زمانهای ورود فوتون، نوسانات خلاء اندازهگیری شده توسط آشکارسازی هموداین، و انتخاب مسیر شکافنده پرتو، همگی منابع تصادفی بودن کوانتومی تایید شده هستند.
- آنتروپی سختافزاری در دستگاههای مصرفی: پردازندههای مدرن شامل دستورالعملهای RNG سختافزاری اختصاصی هستند. RDRAND اینتل از یک منبع نویز حرارتی روی تراشه استفاده میکند که از طریق AES-CBC-MAC تنظیم شده است. معادل آن در AMD نیز به همین ترتیب کار میکند. TrustZone آرم شامل یک منبع آنتروپی سختافزاری است که برای سیستم عامل قابل دسترسی است.
- مجموعههای آنتروپی سیستم عامل: لینوکس آنتروپی را از زمانبندی وقفه، تأخیر ورودی/خروجی دیسک، زمان رسیدن بستههای شبکه و دستورالعملهای RNG سختافزاری جمعآوری میکند و آنها را از طریق یک ساختار رمزنگاری با هم ترکیب میکند تا مجموعه آنتروپی هسته را تولید کند.
مشکل شرطیسازی
نویز فیزیکی خام به ندرت به طور یکنواخت توزیع میشود. یک منبع نویز حرارتی ممکن است به دلیل عدم تقارن مدار، کمی بیشتر از 0ها نسبت به 1ها تولید کند. بنابراین، یک TRNG شامل یک مرحله شرطیسازی - معمولاً یک هش رمزنگاری یا یک تابع استخراجکننده - است که نمونههای خام را به یک خروجی کوتاهتر و به طور قابل اثبات یکنواخت فشرده میکند. نسبت بیتهای خام مصرفشده به بیتهای خروجی تولیدشده، نرخ آنتروپی حداقل نامیده میشود و یک TRNG با طراحی خوب، این نرخ را به دقت مشخص میکند. NIST SP 800-90B الزامات آزمایش و اعتبارسنجی را برای منابع آنتروپی مورد استفاده در سیستمهای فدرال تعریف میکند.
مقایسه PRNG، CSPRNG و TRNG
| ملک | پی آر ان جی | سیاسپیآرانجی | ترنگ |
|---|---|---|---|
| قطعی | بله | بله (بعد از کاشت) | خیر |
| قابل تکثیر از بذر | بله | بله | خیر |
| آزمونهای آماری را با موفقیت پشت سر میگذارد | معمولاً | بله | بله (پس از آمادهسازی) |
| ایمن در برابر پیشبینی | خیر | بله | بله |
| سرعت | خیلی سریع | سریع | کند (محدود به سختافزار) |
| نیاز به آنتروپی سختافزاری دارد | فقط برای بذرپاشی | فقط برای بذرپاشی | همیشه |
| موارد استفاده معمول | شبیهسازیها، بازیها، نمونهبرداری | تولید کلید، توکنها، رمزنگاری | کلیدهای با اطمینان بالا، مقررات قمار، تحقیقات |
تعریف آماری تصادفی بودن
تصادفی بودن یک ویژگی دودویی نیست - بلکه روی یک طیف وجود دارد و استاندارد مناسب کاملاً به کاربرد بستگی دارد. یک دنباله برای یک هدف مشخص تصادفی در نظر گرفته میشود اگر هیچ آزمایشی مرتبط با آن هدف نتواند آن را از یک دنباله تصادفی ایدهآل از نظر تئوری متمایز کند. NIST یک مجموعه آزمون آماری (SP 800-22) منتشر میکند که شامل پانزده آزمون از جمله تحلیل فرکانس، آزمونهای اجرا، تحلیل طیفی و پیچیدگی خطی است. باتری BigCrush کتابخانه TestU01 که در دانشگاه مونترال توسعه یافته است، با اعمال 106 آزمون مجزا، حتی سختتر نیز هست. ژنراتوری که در BigCrush شکست میخورد، صرف نظر از سرعت اجرای آن، برای کارهای شبیهسازی جدی مناسب نیست.
شایان ذکر است که در مورد اینکه تصادفی بودن به چه معنا نیست، دقیق باشیم. دنباله ای مانند ۱، ۲، ۳، ۴، ۵ تصادفی نیست، حتی اگر هر عدد به اندازه هر عدد دیگری محتمل باشد - الگو قابل پیش بینی است. برعکس، یک دنباله می تواند به صورت تصادفی (سه شیر در یک ردیف از یک سکه سالم) بدون اینکه غیر تصادفی باشد، به صورت محلی الگودار به نظر برسد. تصادفی بودن یک ویژگی فرآیند تولید است، نه یک دنباله خروجی خاص که به صورت جداگانه مشاهده می شود.
نحوه کار مولدهای اعداد تصادفی: سازوکارهای اصلی و تاکتیکهای عملی
مولدهای اعداد تصادفی به دو دسته اساسی تقسیم میشوند - مولدهای اعداد شبهتصادفی (PRNG) که از الگوریتمهای قطعی با مقدار اولیه استفاده میکنند و مولدهای اعداد تصادفی واقعی (TRNG) که آنتروپی را از پدیدههای فیزیکی استخراج میکنند. انتخاب نوع مناسب، بذرپاشی صحیح آن و اعمال آن به مورد استفاده خاص شما، تعیین میکند که آیا نتایج شما از نظر آماری صحیح، از نظر رمزنگاری ایمن یا به طرز خطرناکی قابل پیشبینی هستند.
استراتژی گام به گام برای انتخاب و استفاده از RNG
قبل از تولید یک عدد واحد، باید مولد را با وظیفه مورد نظر تطبیق دهید. استفاده از یک PRNG سریع برای تولید کلید رمزنگاری یکی از مهمترین اشتباهات در امنیت نرمافزار است. به همین ترتیب، استفاده از یک RNG سختافزاری کند برای شبیهسازی مونت کارلو با میلیاردها تکرار، منابع را بیجهت هدر میدهد. مراحل زیر شما را در فرآیند تصمیمگیری از اصول اولیه راهنمایی میکند.
مرحله ۱: الزامات تصادفی بودن خود را تعریف کنید
قبل از دست زدن به هر ابزار یا کتابخانهای، سه سوال از خود بپرسید:
- آیا پیشبینیپذیری مهم است؟ اگر حدس زدن اعداد شما توسط یک دشمن باعث آسیب شود - در رمزنگاری، قمار، قرعهکشی یا توکنهای امنیتی - به تصادفی بودن در سطح رمزنگاری نیاز دارید. اگر در حال اجرای یک شبیهسازی فیزیکی یا تغییر لیست پخش هستید، یک PRNG با کیفیت بالا کافی است.
- به چند عدد نیاز دارید؟ بعضی از مولدها دوره تناوب محدودی دارند. تابع Mersenne Twister که به طور گسترده در ماژول
randomپایتون و بسیاری از زبانها استفاده میشود، دوره تناوبی برابر با 219937−1 دارد که برای اکثر اهداف بسیار بزرگ است، اما همچنان محدود و قطعی است. - آیا به تکرارپذیری نیاز دارید؟ آزمایشهای علمی و تولید بازیهای رویهای اغلب نیاز به بازسازی دقیقاً همان توالی دارند. یک PRNG این امکان را برای شما فراهم میکند. یک TRNG این امکان را ندارد.
مرحله ۲: نوع ژنراتور مناسب را انتخاب کنید
| مورد استفاده | ژنراتور توصیه شده | مثالها |
|---|---|---|
| کلیدهای رمزنگاری، رمزهای عبور، توکنها | CSPRNG (PRNG رمزنگاریشده امن) | ماژول secrets (پایتون)، crypto.randomBytes (Node.js)، /dev/urandom (لینوکس) |
| شبیهسازی، آمار، یادگیری ماشین | PRNG با کیفیت بالا | Mersenne Twister، PCG64، xoshiro256** |
| قرعهکشیها، قرعهکشیهای قابل حسابرسی | TRNG یا RNG سختافزاری دارای گواهینامه | RANDOM.ORG، ماژولهای امنیتی سختافزاری (HSM) |
| بازیها، تولید رویهای | PRNG بذردار | مرسن توئیستر، LCG با ثابتهای خوب |
| سیستمهای تعبیهشده بلادرنگ | سختافزار RNG روی تراشه | اینتل RDRAND، ARM TrueRNG |
مرحله ۳: ژنراتور را به درستی راهاندازی کنید
سید (seed) تنها نقطه شکست برای اکثر استقرارهای PRNG است. یک سید ضعیف یا قابل پیشبینی، کل مدل امنیتی یک PRNG را، صرف نظر از اینکه الگوریتم آن چقدر پیچیده باشد، از هم میپاشد.
- از سیدهای با آنتروپی بالا استفاده کنید. مجموعههای آنتروپی سیستم عامل (
/dev/urandomدر یونیکس،CryptGenRandomدر ویندوز) رویدادهای سختافزاری - زمانبندی صفحهکلید، وقفههای دیسک، ورود بستههای شبکه - را ترکیب میکنند تا سیدهایی تولید کنند که پیشبینی آنها عملاً غیرممکن است. - هرگز فقط با ساعت سیستم، seed را انجام ندهید. مهاجمی که زمان تقریبی شروع برنامه شما را میداند، میتواند با استفاده از روش brute-force، seed مبتنی بر timestamp را در عرض چند ثانیه ایجاد کند. این آسیبپذیری در حملات دنیای واقعی به سایتهای پوکر آنلاین و سیستمهای بختآزمایی مورد سوءاستفاده قرار گرفته است.
- هرگز سیدها را در کد عملیاتی به صورت ثابت کدنویسی نکنید. یک سید ثابت در هر اجرا توالی یکسانی تولید میکند. این برای آزمایش مفید است اما از نظر امنیتی فاجعهبار است.
- در برنامههای طولانی مدت، به صورت دورهای Reseed کنید. اگر برنامه شما برای روزها یا هفتهها اجرا میشود، تزریق دورهای آنتروپی تازه مانع از چرخش مولد به حالت قابل پیشبینی میشود.
مرحله ۴: مولد را برای وظیفه خاص خود اعمال کنید
تولید یک عدد تصادفی خام به ندرت هدف نهایی است. کاربرد عملی - نمونهبرداری، ترکیب اعداد تصادفی، نقشهبرداری از محدوده - حالتهای شکست خاص خود را دارد.
تولید اعداد در یک محدوده
رویکرد سادهلوحانهی استفاده از عملگر مدول ( rand() % N ) باعث ایجاد بایاس مدول میشود. اگر محدودهی خروجی مولد به طور مساوی بر N بخشپذیر نباشد، برخی از مقادیر بیشتر از بقیه ظاهر میشوند. برای مثال، اگر مولد شما مقادیری از 0 تا 32767 تولید کند و شما اعدادی از 0 تا 99 بخواهید، مقادیر 0 تا 67 کمی بیشتر از 68 تا 99 ظاهر میشوند، زیرا 32768 بر 100 بخشپذیر نیست.
- از نمونهگیری رد استفاده کنید. مقادیری را که در دنباله مغرضانه قرار میگیرند، کنار بگذارید و دوباره ترسیم کنید. اکثر کتابخانههای استاندارد که به خوبی پیادهسازی شدهاند، این کار را به صورت خودکار انجام میدهند.
- از توابع محدوده داخلی استفاده کنید.
random.randint(a, b)پایتون،ThreadLocalRandom.nextInt(origin, bound)جاوا و توابع مشابه، بایاس را به صورت داخلی مدیریت میکنند. - برای استفاده در رمزنگاری، از ماژول
secretsدر پایتون یا معادل آن استفاده کنید که به طور پیشفرض انتخاب محدوده بیطرفانه را پیادهسازی میکند.
جابجایی منصفانهی یک لیست
الگوریتم فیشر-یتس (که به آن الگوریتم نوث هم میگویند) تنها الگوریتم صحیح برای تولید یک جایگشت تصادفی یکنواخت است. این الگوریتم با تکرار از آخرین عنصر به اولین عنصر، و تعویض هر عنصر با یک عنصر تصادفی انتخاب شده در موقعیت فعلی یا قبل از آن، کار میکند.
- از آخرین اندیس i = n−1 شروع کنید.
- یک شاخص تصادفی j انتخاب کنید که در آن 0 ≤ j ≤ i باشد.
- عناصر را در موقعیتهای i و j با هم عوض کنید.
- i را کاهش دهید و تا زمانی که i = 0 شود، تکرار کنید.
جایگزین سادهلوحانه - انتخاب یک موقعیت تصادفی برای هر عنصر به طور مستقل - توزیع یکنواختی ایجاد نمیکند. برخی از جایگشتها بیشتر از بقیه ظاهر میشوند، که یک نقص قابل اندازهگیری و قابل بهرهبرداری در بازیهای کارتی و لاتاری است.
نمونهگیری بدون جایگزینی
وقتی به k مقدار منحصر به فرد از یک جمعیت n تایی نیاز دارید، استخراج و حذف مقادیر تکراری ناکارآمد است. برای مجموعه دادههای بزرگ یا جریانی از نمونهگیری مخزنی یا برای مجموعههای کوچکتر از Fisher-Yates روی یک کپی از جمعیت استفاده کنید. random.sample(population, k) پایتون این کار را به درستی و کارآمد پیادهسازی میکند.
مرحله ۵: کیفیت خروجی ژنراتور خود را آزمایش کنید
حتی یک RNG که به درستی پیادهسازی شده باشد، اگر ویژگیهای آماری آن با نیازهای برنامه مطابقت نداشته باشد، میتواند در برنامههای خاص با شکست مواجه شود. مجموعههای تست استاندارد اکثر نقصها را تشخیص میدهند.
- TestU01 (BigCrush): دقیقترین مجموعه تست آماری برای PRNGها. این مجموعه صدها تست را اعمال میکند و قادر به تشخیص همبستگیهای ظریفی است که تستهای سادهتر از دست میدهند. بسیاری از ژنراتورهای قدیمی، از جمله برخی از انواع LCG، در BigCrush شکست میخورند.
- Diehard / Dieharder: مجموعهای پرکاربرد از آزمونهای آماری که در ابتدا توسط جورج مارساگلیا توسعه داده شد. Dieharder نسخه بهروز شده و توسعهیافته آن است.
- NIST SP 800-22: مجموعه تست استاندارد برای RNGهای رمزنگاریشده، که برای صدور گواهینامه FIPS الزامی است. این مجموعه تستها فرکانس، تعداد دفعات تکرار، ویژگیهای طیفی و موارد دیگر را بررسی میکند.
- PractRand: به ویژه در تشخیص خرابی در ژنراتورهایی با دورههای کوتاه یا انتشار ضعیف، خوب عمل میکند.
Let AutoSEO write & rank this for you — on autopilot
Enter your site: we scan it, build a keyword plan, and publish ranking-ready articles for Google and AI answers. Start for $1.
اشتباهات رایجی که باید از آنها اجتناب کنید
بیشتر خطاهای RNG در سیستمهای تولیدی از مجموعهای کوچک از خطاهای تکرارشونده ناشی میشوند. تشخیص زودهنگام آنها از اکثر آسیبپذیریها و مصنوعات آماری در دنیای واقعی جلوگیری میکند.
اشتباه ۱: استفاده از Math.random() یا معادل آن برای امنیت
توابع Math.random() جاوااسکریپت، ماژول random پایتون (نه secrets )، rand() در PHP و توابع عمومی مشابه، صراحتاً به عنوان توابع نامناسب برای استفاده در رمزنگاری مستند شدهاند. آنها سرعت را بر غیرقابل پیشبینی بودن اولویت میدهند. مهاجمی که مقادیر خروجی کافی را مشاهده کند، میتواند وضعیت داخلی یک Mersenne Twister را با حداقل ۶۲۴ خروجی ۳۲ بیتی متوالی بازسازی کند، سپس تمام مقادیر آینده را پیشبینی کند. این حمله در پلتفرمهای قمار زنده نشان داده شده است.
اشتباه ۲: استفاده مجدد از یک Seed در چندین Session
اگر یک برنامه وب، مولد توکن جلسه خود را با شناسه فرآیند یا مهر زمانی راهاندازی سرور، seed کند، هر توکن جلسه تولید شده در همان ثانیه، seed یکسانی را به اشتراک میگذارد. این یک فرضیه نیست - این دلیل اصلی آسیبپذیریهای ربودن جلسه در چارچوبهای عملیاتی بوده است.
اشتباه ۳: تولید بیتهای بسیار کم برای آنتروپی مورد نیاز
یک پین ۶ رقمی تقریباً ۲۰ بیت آنتروپی دارد. یک UUID نسخه ۴ دارای ۱۲۲ بیت است. یک کلید رمزنگاری برای رمزگذاری متقارن حداقل به ۱۲۸ بیت و برای امنیت طولانی مدت در برابر سختافزارهای آینده به ۲۵۶ بیت نیاز دارد. تولید توکنهای کوتاه و فرض غیرقابل حدس بودن آنها یک نقص ساختاری است، نه یک جزئیات پیادهسازی.
اشتباه ۴: نادیده گرفتن رفتار مختص پلتفرم
- در برخی از هستههای قدیمیتر لینوکس، خواندن از بلوکهای
/dev/random هنگامی که مخزن آنتروپی خالی میشود./dev/urandom مسدود نمیشود و برای اکثر اهداف رمزنگاری پس از بوت اولیه ایمن است. - ماشینهای مجازی میتوانند در هنگام راهاندازی، آنتروپی کمتری داشته باشند زیرا فاقد تنوع رویدادهای سختافزاری ماشینهای فیزیکی هستند. راهاندازی بلافاصله پس از نمونهسازی ماشین مجازی میتواند کلیدهای ضعیفی ایجاد کند.
- برخی از سیستمهای تعبیهشده اصلاً RNG سختافزاری ندارند. توسعهدهندگان گاهی اوقات به منابع آنتروپی صرفاً نرمافزاری روی میآورند که بسیار ضعیفتر از آن چیزی هستند که به نظر میرسند.
اشتباه ۵: در نظر گرفتن خروجی تصادفی به عنوان خروجی تصادفی یکنواخت بدون تأیید
اگر RNG زیرین دوره تناوبی کوتاهتر از تعداد جایگشتهای ممکن مجموعه داده شما داشته باشد، همه جایگشتها هرگز نمیتوانند تولید شوند. یک دسته کارت استاندارد ۵۲ تایی، ۵۲! ≈ ۲۲۲۶ ترتیب ممکن دارد. یک مولد با یک seed 32 بیتی میتواند حداکثر ۲ ۳۲ ≈ ۴ میلیارد توالی متمایز تولید کند - بخش بسیار کوچکی از همه بر زدنهای ممکن. برای بازیهای کارتی با شرطبندی واقعی، این یک ضعف ملموس و قابل بهرهبرداری است.
اشتباه ۶: یکی دانستن استقلال و یکسانسازی
یک دنباله میتواند به صورت یکنواخت توزیع شود - هر مقدار با فرکانس برابر ظاهر شود - در حالی که همچنان بین ترسیمهای متوالی همبستگی بالایی داشته باشد. بسیاری از LCG های با کیفیت پایین، آزمونهای فرکانس را با موفقیت پشت سر میگذارند اما در آزمونهای طیفی شکست میخورند زیرا مقادیر متوالی آنها در فضای چند بعدی روی تعداد کمی از ابرصفحهها قرار میگیرند. این مصنوع، که به عنوان ساختار شبکهای LCG ها شناخته میشود، آنها را برای انتگرالگیری چند بعدی مونت کارلو نامناسب میکند.
تاکتیکهای عملی بر اساس زبان برنامهنویسی
پایتون
- برای هر مقدار حساس به امنیت،
secrets.token_bytes(n)،secrets.token_hex(n)یاsecrets.randbelow(n)استفاده کنید. - وقتی به رابط استانداردی نیاز دارید که توسط آنتروپی سیستم عامل پشتیبانی شود،
random.SystemRandom()به عنوان جایگزینی برایrandom.Random()استفاده کنید. - برای کارهای عددی، از
numpy.random.default_rng()استفاده کنید که به طور پیشفرض روی مولد PCG64 تنظیم شده است، یک PRNG مدرن با کیفیت بالا که از BigCrush عبور میکند.
جاوا اسکریپت / نود جی اس
- برای تمام اهداف امنیتی
crypto.randomBytes(n)یاcrypto.getRandomValues()(وب API رمزنگاری در مرورگرها) استفاده کنید. - هرگز از
Math.random()برای توکنها، شناسهها یا هر چیزی که یک مهاجم ممکن است سعی در پیشبینی آن داشته باشد، استفاده نکنید.
جاوا
- برای اهداف رمزنگاری
java.security.SecureRandomاستفاده کنید. یک بار آن را نمونهسازی کنید و دوباره از نمونه استفاده کنید - ساخت آن پرهزینه است. -
ThreadLocalRandomبرای برنامههای کاربردی غیرامنیتی با توان عملیاتی بالا در محیطهای چندرشتهای استفاده کنید. - از
java.util.Randomدر زمینههای همزمان اجتناب کنید - از یک سید مشترک استفاده میکند که میتواند در شرایط رقابتی باعث تصادم شود.
سی / سی++
- از
rand()در کتابخانه استاندارد C اجتناب کنید. این تابع تعریفشده توسط پیادهسازی است، اغلب یک LCG ضعیف است و thread-safe نیست. -
std::mt19937از<random>که باstd::random_deviceراهاندازی شده است، برای استفاده عمومی استفاده کنید. - برای استفاده در رمزنگاری، توابع اولیه سیستم عامل را مستقیماً فراخوانی کنید:
getrandom()در لینوکس،BCryptGenRandomدر ویندوز.
ابزارها، نرمافزارها و اتوماسیون مولد اعداد تصادفی
پرکاربردترین ابزارهای تولیدکننده اعداد تصادفی، از سرویسهای مبتنی بر مرورگر مانند RANDOM.ORG (که آنتروپی را از نویز جوی استخراج میکند) تا کتابخانههای رمزنگاری تعبیهشده در هر زبان برنامهنویسی اصلی را شامل میشوند. انتخاب ابزار مناسب به مورد استفاده شما بستگی دارد: شبیهسازیهای آماری به سرعت و کیفیت آماری نیاز دارند، برنامههای امنیتی به غیرقابلپیشبینی بودن رمزنگاری نیاز دارند و آزمایشهای فیزیکی به تصادفی بودن سختافزاری واقعی نیاز دارند.
ابزارهای RNG مبتنی بر مرورگر و آنلاین
ابزارهای RNG آنلاین نیازی به نصب ندارند و برای قرعهکشیهای غیررسمی، نمایشهای کلاسی و تصمیمگیریهای سریع مناسب هستند. معتبرترین گزینهها عبارتند از:
- RANDOM.ORG — از نویز رادیویی اتمسفر به عنوان منبع آنتروپی واقعی استفاده میکند. مولدهای عدد صحیح، درهمسازهای توالی، مولدهای گاوسی و یک API مبتنی بر سهمیه برای دسترسی برنامهریزیشده ارائه میدهد.
- RNG داخلی گوگل - جستجوی "عدد تصادفی بین ۱ تا ۱۰۰" در گوگل، با استفاده از یک PRNG که از آنتروپی سیستم گرفته شده است، نتیجه فوری را برمیگرداند.
- ابزارهای انتخابگر اعداد (Number Picker Wheel) — رابطهای کاربری بصری چرخان که از Math.random() جاوااسکریپت در پسزمینه استفاده میکنند و برای انتخابهای کلاسی یا نمایشی مناسب هستند.
- نظرسنجی نی و چرخه نامها - ورودی لیست را با انتخاب تصادفی برای تخصیص تیم، قرعهکشی جوایز و تصمیمات گروهی ترکیب کنید.
یکی از محدودیتهای قابل توجه اکثر ابزارهای مرورگر این است که به Math.random() جاوا اسکریپت متکی هستند، که یک PRNG است و از نظر رمزنگاری امن نیست. برای هر چیزی که مربوط به امنیت، توکنها یا تصمیمات مالی باشد، به جای آن از یک ابزار یا کتابخانه رمزنگاری اختصاصی استفاده کنید.
کتابخانههای زبانهای برنامهنویسی و توابع داخلی
هر زبان برنامهنویسی اصلی حداقل یک ماژول RNG دارد. جدول زیر گزینههای رایج و طبقهبندی امنیتی آنها را خلاصه میکند:
| زبان | استاندارد PRNG | RNG رمزنگاریشده | یادداشتها |
|---|---|---|---|
| پایتون | تصادفی (مرسن توئیستر) | اسرار، os.urandom() | استفاده از رمزهای عبور برای توکنها، رمزهای عبور و کلیدها |
| جاوا اسکریپت | تابع تصادفی ریاضی (Math.random) | crypto.getRandomValues() | API رمزنگاری وب در تمام مرورگرهای مدرن موجود است |
| جاوا | java.util.Random | جاوا.امنیتی.SecureRandom | SecureRandom تا زمانی که آنتروپی کافی در دسترس باشد، بلوک میکند |
| سی / سی++ | rand() (در محیط عملیاتی از آن اجتناب کنید) | /dev/urandom، دستورالعمل RDRAND | تابع rand() ضعیف است؛ برای هر چیز جدی از آنتروپی سطح سیستم عامل استفاده کنید. |
| برو | ریاضی/رند | کریپتو/رند | crypto/rand مستقیماً از CSPRNG سیستم عامل میخواند |
| روبی | تصادفی (مبتنی بر MT) | امنرندوم | SecureRandom، OpenSSL یا /dev/urandom را پوشش میدهد. |
| پی اچ پی | رند()، mt_rand() | تابع ()random_bytes و تابع ()random_int | تابع random_int() از نسخه ۷ PHP به بعد توسط CSPRNG پشتیبانی میشود. |
دستگاههای RNG سختافزاری
برای کاربردهایی که به آنتروپی با بالاترین کیفیت نیاز دارند - مانند تولید کلید مجوز گواهی، ماژولهای امنیتی سختافزاری (HSM) یا ابزار دقیق علمی - مولدهای اعداد تصادفی سختافزاری اختصاصی (HRNG) در دسترس هستند:
- Intel RDRAND / RDSEED — دستورالعملهای سطح CPU که نویز حرارتی را از مدارهای روی تراشه نمونهبرداری میکنند، که از زمان Ivy Bridge (2012) در اکثر پردازندههای x86 مدرن موجود است.
- منابع داده اختصاصی USB HRNG - دستگاههایی مانند OneRNG یا TrueRNG به پورت USB متصل میشوند و آنتروپی را از طریق /dev/random یا /dev/urandom در لینوکس به مخزن سیستم عامل ارسال میکنند.
- HSMها (ماژولهای امنیتی سختافزاری) — دستگاههای رده سازمانی از فروشندگانی مانند Thales، Entrust و AWS CloudHSM که کلیدهای رمزنگاری را با استفاده از منابع آنتروپی سختافزاری معتبر تولید و ذخیره میکنند.
- سرویسهای RNG کوانتومی — رابطهای برنامهنویسی کاربردی ابری از ID Quantique و ANU (دانشگاه ملی استرالیا) بیتهای تصادفی مشتق شده از نوسانات خلاء کوانتومی را ارائه میدهند و خروجی غیرقطعی قابل اثباتی را ارائه میدهند.
اتوماسیون و یکپارچهسازی گردش کار
خودکارسازی تولید اعداد تصادفی در گردشهای کاری بزرگتر - خطوط لوله تست A/B، شبیهسازیهای مونت کارلو، قرعهکشیهای برنامهریزیشده یا نمونهگیری تصادفی حسابرسی - معمولاً شامل یکی از سه رویکرد زیر است:
- ادغام API — RANDOM.ORG یک API از نوع JSON-RPC ارائه میدهد که اعداد صحیح، دنبالهها، رشتهها و UUIDهای تصادفی واقعی را برمیگرداند. درخواستهای احراز هویت شده، سهمیههای بالاتر و تصادفی بودن امضا شده را با گواهیهای اصالت قابل تأیید، امکانپذیر میکنند.
- بذرپاشی خط لوله CI/CD — ابزارهای تست آماری مانند TestU01 یا Dieharder میتوانند به طور خودکار در خطوط لوله ادغام مداوم اجرا شوند تا تأیید کنند که هرگونه پیادهسازی RNG سفارشی، کیفیت آماری را در طول تغییرات کد حفظ میکند.
- زمانبندی بومی پلتفرم — پلتفرمهای ابری (AWS Lambda، Google Cloud Functions، Azure Functions) میتوانند فرآیندهای مبتنی بر RNG را طبق یک زمانبندی آغاز کنند، به عنوان مثال برای نمونهبرداری تصادفی از ورودیهای لاگ برای ممیزیهای امنیتی یا اختصاص گروههای تصادفی روزانه در آزمایشهای رفتاری.
ابزارهایی مانند AutoSEO نشان میدهند که چگونه اتوماسیون میتواند حتی به گردشهای کاری محتوا و دادهها که به نمونهگیری تصادفی وابسته هستند، گسترش یابد. AutoSEO فرآیند شناسایی، حسابرسی و اولویتبندی وظایف سئو را با استفاده از تکنیکهای نمونهگیری تصادفی برای انتخاب زیرمجموعههای صفحه نماینده از مجموعه دادههای بزرگ خزش، خودکار میکند - تضمین میکند که بررسیهای کیفی بیطرفانه هستند و هیچ نقطه کور سیستماتیکی از حسابرسی همیشگی صفحات پرترافیک یکسان پدیدار نمیشود. این همان منطقی را منعکس میکند که در آزمایشهای تصادفی کنترلشده استفاده میشود: با معرفی تصادفی بودن ساختاریافته در فرآیند انتخاب، AutoSEO ارزیابیهای سلامت سایت از نظر آماری معتبرتری نسبت به حسابرسان مبتنی بر قانون قطعی تولید میکند.
چگونه کیفیت و موفقیت یک مولد اعداد تصادفی را اندازهگیری کنیم؟
یک مولد اعداد تصادفی خوب، آزمونهای آماری مربوط به یکنواختی، استقلال و غیرقابلپیشبینی بودن را با موفقیت پشت سر میگذارد. معیارهای اصلی، مجموعههای آزمون تجربی، تحلیل دوره نظری و - برای RNGهای رمزنگاریشده - مقاومت در برابر حملات بازسازی حالت هستند.
مجموعه آزمونهای آماری
هیچ دنباله متناهی را نمیتوان واقعاً تصادفی بودن آن را اثبات کرد، اما میتوان دنبالهها را برای تشخیص غیرتصادفی بودنشان آزمایش کرد. معتبرترین مجموعههای آزمایش عبارتند از:
- NIST SP 800-22 — مجموعهای از ۱۵ آزمون آماری منتشر شده توسط مؤسسه ملی استاندارد و فناوری، که برای ارزیابی RNG های ارائه شده برای صدور گواهینامه رمزنگاری استفاده میشود. این آزمونها شامل آزمونهای فرکانسی، اجرا، طیفی (DFT) و سریالی هستند.
- TestU01 (BigCrush) — BigCrush که در دانشگاه مونترال توسعه یافته است، سختگیرانهترین مجموعه آزمونهای آماری موجود در دسترس عموم است. الگوریتمهایی مانند LCGها و مولدهای قدیمیتر Wichmann-Hill در آن شکست میخورند؛ Xoshiro256** و PCG از آن عبور میکنند.
- دیهاردر — یک افزونه متنباز از باتری دیهارد اصلی جورج مارساگلیا، که بیش از ۱۰۰ آزمایش را روی نمونههای بزرگی از خروجی ژنراتور انجام میدهد.
- PractRand — یک مجموعه تست مدرن که برای نمونههای بسیار بزرگ (ترابایت خروجی) قابل استفاده است و قادر به تشخیص سوگیریهای ظریفی است که در تستهای نمونههای کوچکتر قابل مشاهده نیستند.
معیارهای کلیدی کیفیت
- طول دوره — تعداد مقادیر تولید شده قبل از تکرار دنباله. Mersenne Twister دارای دوره 2 19937 −1 است که تقریباً برای همه کاربردهای غیر رمزنگاری کافی است.
- توزیع برابر - اینکه آیا مقادیر به طور یکنواخت در محدوده خروجی در تصاویر یک بعدی، دو بعدی و با ابعاد بالاتر پخش شدهاند یا خیر.
- حساسیت به سید — اینکه آیا تغییرات کوچک در سید، توالیهای خروجی کاملاً متفاوتی ایجاد میکند یا خیر (برای تکرارپذیری شبیهسازی مهم است).
- توان عملیاتی — سرعت خروجی بر حسب مگابایت بر ثانیه یا میلیاردها عدد در ثانیه، که برای بارهای کاری مونت کارلو با کارایی بالا مرتبط است.
- محرمانگی رو به جلو و رو به عقب - برای CSPRNGها، اینکه آیا مهاجمی که خروجی را در زمان T مشاهده میکند، میتواند خروجی گذشته یا آینده را بازسازی کند یا خیر. این امر با تلاش برای بازسازی حالت از بیتهای مشاهده شده آزمایش میشود.
سنجش موفقیت در زمینههای کاربردی
فراتر از کیفیت فنی، معیارهای موفقیت به زمینه استقرار بستگی دارند:
- قرعهکشیها و بختآزماییها - پیگیریهای حسابرسی، تأیید شخص ثالث و گواهیهای تصادفی امضا شده (موجود در RANDOM.ORG) انصاف را برای شرکتکنندگان نشان میدهند.
- کاربردهای رمزنگاری - انطباق با گواهینامههای FIPS 140-3 یا Common Criteria تأیید میکند که منبع آنتروپی و CSPRNG مطابق با استانداردهای دولتی و صنعتی هستند.
- شبیهسازیهای علمی - تکرارپذیری (یک نمونه اولیه نتایج یکسانی را تولید میکند) و قابلیت عبور از BigCrush یا PractRand در اندازههای نمونه مورد استفاده در شبیهسازی.
- آزمایش A/B - بررسیهای تعادل تأیید میکنند که گروههای درمان و کنترل از نظر آماری در متغیرهای کمکی قبل از آزمایش معادل هستند و تأیید میکنند که تصادفیسازی بیطرفانه بوده است.
سوالات متداول
تفاوت بین یک مولد اعداد تصادفی واقعی و یک مولد اعداد شبه تصادفی چیست؟
یک مولد اعداد تصادفی واقعی (TRNG) تصادفی بودن را از یک فرآیند فیزیکی و غیرقابل پیشبینی - مانند نویز حرارتی، واپاشی رادیواکتیو یا نویز رادیویی اتمسفری - استخراج میکند و خروجیای تولید میکند که واقعاً غیرقطعی است. یک مولد اعداد شبهتصادفی (PRNG) از یک الگوریتم ریاضی قطعی استفاده میکند که با یک مقدار اولیه بذردهی شده است. با توجه به بذر یکسان، همیشه توالی یکسانی تولید میکند. PRNGها سریعتر و قابل تکرار هستند و همین امر آنها را برای شبیهسازیها و بازیها ایدهآل میکند. TRNGها کندتر هستند اما زمانی که غیرقابلپیشبینی بودن یک نیاز امنیتی است، مانند تولید کلیدهای رمزنگاری، ضروری هستند.
آیا استفاده از Math.random() در جاوا اسکریپت برای اهداف امنیتی ایمن است؟
خیر. تابع Math.random() در جاوااسکریپت یک PRNG است که صراحتاً به عنوان یک تابع غیر ایمن از نظر رمزنگاری مستند شده است. وضعیت داخلی آن میتواند به طور بالقوه از خروجی مشاهده شده بازسازی شود و هرگز نباید برای تولید رمزهای عبور، توکنهای جلسه، کلیدهای API یا هر مقداری که حدس زدن خروجی توسط مهاجم میتواند باعث آسیب شود، استفاده شود. برای برنامههای حساس به امنیت در مرورگر، از crypto.getRandomValues() از API رمزنگاری وب استفاده کنید که توسط CSPRNG سیستم عامل پشتیبانی میشود.
آیا یک مولد اعداد تصادفی میتواند واقعاً غیرقابل پیشبینی باشد؟
یک TRNG مبتنی بر سختافزار که از پدیدههای کوانتومی - مانند زمان رسیدن فوتون یا نوسانات خلاء کوانتومی - سرچشمه میگیرد، اساساً طبق مکانیک کوانتومی غیرقابل پیشبینی در نظر گرفته میشود، به این معنی که هیچ الگوریتم یا اطلاعات اضافی نمیتواند به یک ناظر اجازه دهد خروجی آن را بهتر از شانس پیشبینی کند. PRNGها و اکثر CSPRNGهای نرمافزاری تحت فرضیات رمزنگاری استاندارد از نظر محاسباتی غیرقابل پیشبینی هستند، به این معنی که در عمل ایمن هستند اما به معنای فیزیکی مطلق، غیرقابل پیشبینی بودن آنها قابل اثبات نیست.
چگونه بذردهی بر یک مولد اعداد تصادفی تأثیر میگذارد؟
سید (seed) مقدار اولیهای است که به یک الگوریتم PRNG داده میشود. سید یکسان همیشه توالی یکسانی را تولید میکند، که یک ویژگی در محاسبات علمی است زیرا آزمایشها را قابل تکرار میکند. یک سید ضعیف - مانند استفاده از ثانیه فعلی به عنوان تنها منبع آنتروپی - به طور چشمگیری تصادفی بودن موثر را کاهش میدهد زیرا یک مهاجم میتواند تمام سیدهای محتمل را بشمارد. یک روش سیدینگ خوب، چندین منبع آنتروپی را ترکیب میکند: زمان فعلی بر حسب نانوثانیه، شناسه فرآیند، آدرسهای حافظه و آنتروپی ارائه شده توسط سیستم عامل از /dev/urandom یا CryptGenRandom در ویندوز.
ماژول تصادفی پایتون از چه مولد عدد تصادفی استفاده میکند؟
ماژول random پایتون از الگوریتم Mersenne Twister (MT19937) استفاده میکند که دوره تناوب آن 2 19937 −1 است و اکثر آزمونهای آماری را با موفقیت پشت سر میگذارد. این الگوریتم برای شبیهسازیها، بازیها و نمونهبرداری آماری مناسب است. با این حال، از نظر رمزنگاری ایمن نیست - حالت داخلی را میتوان پس از مشاهده 624 خروجی متوالی 32 بیتی بازسازی کرد. برای کارهای حساس به امنیت در پایتون، از ماژول secrets استفاده کنید که توسط os.urandom() پشتیبانی میشود و از CSPRNG سطح سیستم عامل استخراج میشود.
چگونه اعداد تصادفی بدون کامپیوتر تولید میشوند؟
قبل از کامپیوترها، اعداد تصادفی با روشهای فیزیکی تولید میشدند: انداختن تاس، بیرون کشیدن توپهای شمارهدار از یک درام چرخان، انداختن سکه یا بر زدن کارتها. شرکت RAND در سال ۱۹۵۵ کتاب معروفی با عنوان « یک میلیون رقم تصادفی با ۱۰۰۰۰۰ انحراف نرمال» منتشر کرد که توسط یک چرخ رولت الکترونیکی تولید شده بود. جداول آماری اعداد تصادفی به طور گسترده در نمونهگیریهای پیمایشی و آزمایشهای بالینی مورد استفاده قرار میگرفتند. امروزه، روشهای دستی هنوز در برخی از قرعهکشیهای تنظیمشده و در نمایشهای کلاسی استفاده میشوند، اگرچه حسابرسی آنها نسبت به روشهای الکترونیکی کندتر و دشوارتر است.
چرا مولدهای اعداد تصادفی نیاز به آزمایش دارند؟
حتی الگوریتمهایی که برای تولید خروجی با ظاهر تصادفی طراحی شدهاند، میتوانند شامل سوگیریهای ظریف، چرخههای کوتاه در ابعاد خاص یا همبستگیهایی بین مقادیر متوالی باشند که برای بررسیهای تصادفی نامرئی هستند اما با آزمونهای آماری قابل تشخیص هستند. این نقصها میتوانند نتایج شبیهسازی را بیاعتبار کنند، امنیت سیستمهای رمزنگاری را کاهش دهند یا بیعدالتی را در بازیها و قرعهکشیها ایجاد کنند. آزمایش با مجموعههایی مانند NIST SP 800-22، BigCrush یا PractRand این مشکلات را قبل از استقرار شناسایی میکند. نمونههای تاریخی از مولدهای دارای نقص - از جمله نسخههای اولیه mt_rand() در PHP و اشکال OpenSSL دبیان در سال ۲۰۰۸ - نشان میدهد که RNGهای آزمایش نشده میتوانند باعث خرابیهای امنیتی واقعی شوند.
مولد اعداد شبه تصادفی امن رمزنگاری شده (CSPRNG) چیست؟
یک CSPRNG، یک PRNG است که دو الزام امنیتی اضافی فراتر از کیفیت آماری را برآورده میکند: تست بیت بعدی (هیچ الگوریتمی نمیتواند بیت بعدی را با احتمالی به طور قابل توجهی بهتر از 50٪ با توجه به تمام بیتهای قبلی پیشبینی کند) و مقاومت در برابر گسترش سازش وضعیت (اگر یک مهاجم وضعیت داخلی را در زمان T یاد بگیرد، نمیتواند خروجی را از قبل از T بازسازی کند). CSPRNG های مدرن شامل ژنراتورهای مبتنی بر ChaCha20 (که در /dev/urandom لینوکس از هسته 4.8 استفاده میشوند)، Fortuna (که در macOS و iOS استفاده میشود) و CTR_DRBG (که توسط NIST در SP 800-90A استاندارد شده است) هستند.
آیا مولدهای اعداد تصادفی میتوانند مقادیر تکراری تولید کنند؟
بله، و این رفتار مورد انتظار است. یک فرآیند واقعاً تصادفی هیچ حافظهای از خروجیهای گذشته ندارد، بنابراین تکرارها به طور طبیعی رخ میدهند - این با مسئله تولد در نظریه احتمال توصیف میشود. در یک قرعهکشی یکنواخت از ۱ تا N، تکرارها زمانی محتمل میشوند که تقریباً √N مقدار کشیده شده باشند. اگر برنامه شما به مقادیر منحصر به فرد نیاز دارد (مانند اختصاص شناسههای منحصر به فرد یا بُر زدن یک دسته کارت بدون تکرار)، باید از یک الگوریتم بُر زدن مانند فیشر-یتس روی یک مجموعه از پیش تعریف شده استفاده کنید، یا مجموعهای از مقادیر از قبل استفاده شده را حفظ کنید و موارد تکراری را رد کنید، به جای اینکه برای جلوگیری از تصادم به خروجی خام RNG تکیه کنید.
ابزارهای قرعهکشی و اهدای جوایز آنلاین چگونه عدالت را تضمین میکنند؟
ابزارهای معتبر قرعهکشی آنلاین، انصاف را از طریق ترکیبی از موارد زیر تضمین میکنند: استفاده از یک منبع آنتروپی با کیفیت بالا (در حالت ایدهآل یک TRNG به جای Math.random())، انتشار الگوریتم و سید قبل از قرعهکشی تا نتایج به طور مستقل تأیید شوند، ارائه گواهیهای تصادفی امضا شده که ثابت میکند اعداد قبل از بسته شدن قرعهکشی تولید شدهاند، و انجام قرعهکشیها در حضور حسابرسان مستقل. RANDOM.ORG یک سرویس قرعهکشی شخص ثالث ارائه میدهد که هر قرعهکشی را مهر زمانی و رمزنگاری میکند و یک رکورد قابل حسابرسی ایجاد میکند. برای قرعهکشیهای تحت نظارت، مقامات ملی بازی قبل از راهاندازی هر سیستمی، به RNGهای سختافزاری دارای گواهینامه و تأیید آزمایشگاه آزمایش مستقل نیاز دارند.
Stop doing SEO by hand
Put your SEO on autopilot — your first 3 articles for $1
Auto SEO scans your site, builds a content plan, and writes ranking-ready articles automatically. Start your $1 trial — the AI writes your first 3 the moment you begin. Cancel anytime in 3 days.
2,147+ businesses · Cancel anytime · No lock-in