کدگذاری امن 101: نحوه استفاده از تابع تصادفی

اعداد تصادفی در همه جای وب وجود دارند و امنیت شما به آنها بستگی دارد. بیایید ببینیم که آیا از آنها درست استفاده می کنید یا خیر.
اعداد تصادفی نقش مهمی در امنیت برنامه های وب دارند. آنها در شناسه های جلسه، رمزهای عبور، کلیدهای رمزنگاری و موارد دیگر استفاده می شوند. با این حال، اگر به طور ایمن پیادهسازی نشوند، میتوانند منجر به آسیبپذیریهایی شوند که مهاجمان میتوانند از آنها برای دسترسی غیرمجاز به اطلاعات حساس سوء استفاده کنند.
TLDR
- اکثر ژنراتورهای تصادفی واقعا تصادفی نیستند. آنها از ریاضیاتی استفاده می کنند که تصادفی به نظر می رسد
- استفاده نکن
Math.random()
در جاوا اسکریپت یاrandom
در پایتون - استفاده کنید
Web Crypto API
در جاوا اسکریپت،crypto
ماژول در NodeJs وsecrets
در پایتون - سعی نکنید الگوریتم تولید تصادفی خود را پیاده سازی کنید
- استفاده نادرست از اعداد تصادفی امن می تواند برنامه شما را آسیب پذیر کند
نحوه عملکرد توابع تصادفی
دو نوع اصلی مولد اعداد تصادفی (RNGs) وجود دارد: مولد اعداد تصادفی شبه (PRNG) و مولد اعداد تصادفی واقعی (TRNG).
مولد اعداد شبه تصادفی (PRNG)
PRNG ها متداول ترین نوع RNG هستند. آنها با استفاده از یک الگوریتم برای تولید دنباله ای از اعداد که تصادفی به نظر می رسند، کار می کنند. الگوریتم یک مقدار اولیه را به عنوان ورودی می گیرد و بر اساس آن یک سری اعداد تولید می کند.
الگوریتم های رایج مورد استفاده در PRNG ها مرسن-تویستر و ژنراتور همگام خطی (LCG) هستند.
این الگوریتم ها یک عدد اولیه به نام می گیرند seed
. آنها آن را با اضافه کردن شماره تصادفی قبلی، تغییر دادن و انجام عملگرهای XOR برای تولید خروجی تغییر می دهند. خروجی شبیه یک عدد تصادفی به نظر می رسد، اگرچه فقط خروجی یک فرمول است.
اگر به اجرای هر PRNG ادامه دهید، در نهایت همان اعداد را بارها و بارها ایجاد می کند. هر PRNG دارای طول ثابتی از اعداد است که می تواند قبل از شروع مجدد ایجاد کند.
مولد اعداد تصادفی واقعی (TRNG)
TRNG ها بر اساس فرآیندهای فیزیکی که ذاتا تصادفی هستند، اعداد واقعا تصادفی تولید می کنند. این فرآیندها شامل نویز اتمسفر، واپاشی رادیواکتیو و نویز حرارتی است. TRNG ها فرآیند فیزیکی را اندازه گیری می کنند و آن را به یک عدد تصادفی تبدیل می کنند.
آسیب پذیری های عملکرد تصادفی
الگوریتم بذر و تولید اعداد تصادفی هر دو می توانند نقاط ضعفی داشته باشند.
پیش بینی
می توان گفت پیش بینی پذیری آسیب پذیری اصلی مولدهای اعداد تصادفی ضعیف است. PRNG ها ذاتا قابل پیش بینی هستند زیرا بر اساس یک فرمول ریاضی هستند. بنابراین اگر دانه و آخرین عدد تصادفی را می دانید، می توانید عدد تصادفی بعدی را پیش بینی کنید. این می تواند منجر به آسیب پذیری های شدید شود.
به عنوان مثال، یک قابلیت فراموشی رمز عبور را در نظر بگیرید که کلمات بر اساس یک نشانه تصادفی است. اگر رمز قابل پیش بینی باشد، مهاجم می تواند رمز عبور هر کاربری را بازنشانی کند.
برخورد
علاوه بر قابلیت پیش بینی، برخی از ژنراتورهای تصادفی که کیفیت پایینی دارند، اغلب مقادیر تکراری تولید می کنند. این می تواند خطر برخورد را افزایش دهد.
برنامهای را در نظر بگیرید که توکنهای جلسه تصادفی را برای کاربران خود تولید میکند. شانس تولید توکن های جلسه تکراری به دو عامل مرتبط است:
- اندازه فضای تصادفی (طول نشانه جلسه)
- کیفیت انتخاب تصادفی
توکن های با طول کوتاه شانس بیشتری برای برخورد خواهند داشت. و مولد تصادفی بد همه مقادیر ممکن را تولید نمی کند. این می تواند منجر به آسیب پذیری هایی شود که در آن کاربر می تواند داده های کاربر دیگر را ببیند.
نشت یا دستکاری بذر
یکی دیگر از آسیب پذیری های مربوط به مولدهای اعداد تصادفی، انتخاب دانه ضعیف است. PRNG همیشه یک دنباله از اعداد را با همان مقدار اولیه اولیه تولید می کند. اگر مهاجم بتواند دانه استفاده شده را پیدا کند یا آن را دستکاری کند، به راحتی می تواند همان اعداد تصادفی را تولید کند.
در عمل، هکرها از روش های مختلفی برای پیش بینی عدد تصادفی بعدی استفاده می کنند. برخی از روش ها ممکن است شامل تجزیه و تحلیل آماری باشند، در حالی که برخی دیگر ممکن است شامل مهندسی معکوس الگوریتم ژنراتور باشند.
نحوه استفاده از اعداد تصادفی امن
استفاده از الگوریتم های تولید اعداد تصادفی ایمن رمزنگاری شده، کلید تولید ایمن اعداد تصادفی است. این الگوریتم ها اعداد تصادفی را تولید می کنند که غیرقابل پیش بینی هستند و مهاجمان نمی توانند به راحتی آنها را حدس بزنند. خروجی این الگوریتم ها در برابر حملات brute-force مقاوم است و از نظر آماری قوی است.
شما نباید سعی کنید برنامه خود را پیاده سازی کنید، مگر اینکه بدانید چه کاری انجام می دهید. درعوض، همیشه از کتابخانه های تصادفی ایمن شناخته شده استفاده کنید.
بیایید چند نمونه از استفاده از کتابخانه های تصادفی امن در زبان های برنامه نویسی مختلف را ببینیم.
جاوا اسکریپت
را Math.random()
تابع برای اهداف رمزنگاری مناسب نیست، زیرا واقعا تصادفی نیست و می تواند توسط یک مهاجم پیش بینی یا دستکاری شود.
برای ایجاد یک عدد تصادفی امن در جاوا اسکریپت، می توانید از Web Crypto API
. را Crypto.getRandomValues()
روش به شما امکان می دهد مقادیر تصادفی رمزنگاری قوی را بدست آورید. در اینجا یک کد مثال است که یک عدد تصادفی امن تولید می کند:
function generateRandomNumber() {
const array = new Uint32Array(1); // Create a 32-bit unsigned integer array
window.crypto.getRandomValues(array); // Fill the array with random values
return array[0]; // Return the first element of the array as the random number
}
console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
NodeJS
در NodeJS، crypto
ماژول را می توان برای تولید اعداد تصادفی امن رمزنگاری استفاده کرد. نمونه کد زیر استفاده از ماژول رمزنگاری را در تولید یک عدد تصادفی نشان می دهد:
const crypto = require('crypto');
function generateRandomNumber() {
const randomBytes = crypto.randomBytes(4); // Generate 4 random bytes
const hexValue = randomBytes.toString('hex'); // Convert the bytes to a hex string
const intValue = parseInt(hexValue, 16); // Convert the hex string to an integer
return intValue;
}
console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
پایتون
در پایتون، random
ماژول را می توان برای تولید اعداد تصادفی استفاده کرد. با این حال، از نظر رمزنگاری امن نیست. در عوض، شما می توانید استفاده کنید secrets
ماژول برای تولید اعداد تصادفی امن از نظر رمزنگاری. نمونه کد زیر استفاده از ماژول Secrets را در تولید یک عدد تصادفی نشان می دهد:
import secrets
def generate_random_number():
random_number = secrets.randbits(32) # Generate a 32-bit random number
return random_number
print(generate_random_number()) # Output a random number between 0 and 4294967295
نتیجه
اعداد تصادفی در کامپیوتر فرمول های ریاضی و قابل پیش بینی هستند. هر مولد اعداد تصادفی برای رمزنگاری و استفاده امنیتی مناسب نیست. اعداد تصادفی تنها یک عنصر در طراحی و پیاده سازی سیستم امنیتی هستند. موارد بسیار دیگری مانند تولید بذر، مدیریت کلید و طراحی کلی سیستم امنیتی وجود دارد که بسیار مهم هستند و درست کردن آنها سخت است. Crypto 101 مکانی عالی برای شروع یادگیری بیشتر در مورد رمزنگاری است.
در وبلاگ امنیتی SmartScanner بیشتر بخوانید.