PRNG ضعیف
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
دسته OWASP: MASVS-CRYPTO: رمزنگاری
نمای کلی
مولد اعداد شبه تصادفی (PRNG) الگوریتمی است که توالی اعداد قابل پیش بینی را بر اساس یک مقدار شروع به نام seed تولید می کند. یک دنباله اعداد تولید شده توسط PRNG تقریباً همان ویژگی های یک دنباله اعداد تصادفی واقعی را دارد، اما ایجاد آن سریعتر و از نظر محاسباتی هزینه کمتری دارد.
به عبارت دیگر، PRNG ها از نظر یکنواختی توزیع آنتروپی، که دنباله های اعداد واقعا تصادفی را تقلید می کنند، نسبت به RNG های ضعیف (مثلاً java.math.Random
) اطمینان بیشتری دارند. تولید اعداد تصادفی واقعاً به تجهیزات تخصصی نیاز دارد و اغلب خارج از محدوده توسعه عادی است. این سند تولید اعداد واقعاً تصادفی را پوشش نمیدهد و تنها بر روی PRNG تمرکز میکند، زیرا آنها روش استاندارد در حال استفاده هستند.
آسیبپذیریهای ضعیف PRNG زمانی رخ میدهند که توسعهدهندگان از یک PRNG معمولی برای مقاصد رمزنگاری استفاده میکنند، به جای یک PRNG امن رمزنگاری (CSPRNG). CSPRNG ها الزامات سخت گیرانه تری دارند، و وقتی seed ناشناخته است، باید به مهاجم فقط یک مزیت ناچیز در تمایز یک توالی خروجی از یک دنباله تصادفی واقعی بدهد.
مهاجمان همچنین ممکن است بتوانند توالی اعداد تولید شده را حدس بزنند زمانی که دانههای قابل پیشبینی - مانند آنهایی که به سختی توسط توسعهدهنده کدگذاری شدهاند - برای مقداردهی اولیه یک PRNG یا CSPRNG استفاده میشوند، زیرا مهاجم میتواند دانه را حدس بزند و بنابراین خروجی تولید شده توسط PRNG را پیشبینی کند.
تاثیر
اگر یک PRNG غیر رمزنگاری امن در زمینه امنیتی مانند احراز هویت استفاده شود، مهاجم ممکن است بتواند اعداد تولید شده به طور تصادفی را حدس بزند و به دادهها یا ویژگیهای ممتاز دسترسی پیدا کند.
اقدامات کاهشی
ژنرال
java.security.SecureRandom
برای مصارف امنیتی توصیه می شود . اگر نسخه هسته لینوکس 5.17+ است یا مسدود کردن رشته قابل قبول است، منتظر بمانید تا آنتروپی کافی جمع شود قبل از اینکه اعداد تصادفی را ایجاد کنید (یعنی از /dev/random
استفاده کنید). برای انجام این کار، getInstanceStrong()
را فراخوانی کنید:
کاتلین
val rand = SecureRandom.getInstanceStrong()
جاوا
SecureRandom rand = SecureRandom.getInstanceStrong();
در غیر این صورت، در نسخههای هسته لینوکس قبل از 5.17، زمانی که مسدود کردن رشته در هنگام تولید اعداد تصادفی غیرقابل قبول است، پس سازنده SecureRandom
باید مستقیماً فراخوانی شود:
کاتلین
import java.security.SecureRandom
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = SecureRandom()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
// Use rand_int for security & authentication
}
}
جاوا
import java.security.SecureRandom;
public class generateRandom {
public static void main(String args[])
{
// Create instance of SecureRandom class
SecureRandom rand = new SecureRandom();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
// Use rand_int for security & authentication
}
}
SecureRandom
دانه پیشفرض را از /dev/urandom
دریافت میکند، و بهطور خودکار زمانی که شی ساخته یا بهدست میآید استفاده میشود، بنابراین نیازی به seed کردن صریح PRNG نیست. به طور کلی، هرگونه استفاده قطعی از SecureRandom
ممنوع است (مخصوصاً اگر این امر منجر به کدنویسی سخت یک مقدار seed شود، که هر کسی که برنامه را دیکامپایل کند می تواند ببیند). توسعه دهندگانی که می خواهند خروجی شبه تصادفی قابل تکرار تولید کنند باید از اولیه های مناسب تری مانند HMAC، HKDF و SHAKE استفاده کنند.
java.util.Random
برای اهداف امنیتی / احراز هویت اجتناب کنید ، قابل استفاده برای هر چیز دیگری است.
کاتلین
import java.util.Random
object generateRandom {
@JvmStatic
fun main(args: Array<String>) {
// Create instance of SecureRandom class
val rand = Random()
// Generate random integers in range 0 to 999
val rand_int = rand.nextInt(1000)
}
}
جاوا
import java.util.Random;
public class generateRandom {
public static void main(String args[])
{
// Create instance of Random class
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int = rand.nextInt(1000);
}
}
منابع
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Weak PRNG\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-CRYPTO: Cryptography](https://mas.owasp.org/MASVS/06-MASVS-CRYPTO)\n\nOverview\n--------\n\nA pseudorandom number generator (PRNG) is an algorithm that generates\npredictable number sequences based on a starting value called a *seed* . A\nPRNG-generated number sequence has **approximately** the same properties as a\ntruly random number sequence, but is faster and less computationally expensive\nto create.\n\nIn other words, PRNGs have higher assurances than weak RNGs (e.g.\n`java.math.Random`) in terms of evenness of entropy distribution, which emulate\ntruly random number sequences. Truly random number generation requires\nspecialized equipment and is often outside the scope of normal development. This\ndocument does not cover truly random number generation, and focuses only on\nPRNGs as they are the standard methodology in use.\n\nWeak PRNG vulnerabilities occur when developers use a regular PRNG for\ncryptographic purposes, instead of a cryptographically-secure PRNG (CSPRNG).\nCSPRNGs have stricter requirements, and when the seed is unknown, they must give\nan attacker only an insignificant advantage in differentiating an output\nsequence from an actual random sequence.\n\nAttackers may also be able to guess the generated number sequence when\npredictable seeds -- such as those hard coded by the developer -- are used to\ninitialize a PRNG or CSPRNG, as the attacker can guess the seed and thus predict\nthe output generated by the PRNG.\n\nImpact\n------\n\nIf a non-cryptographically secure PRNG is used in a security context like\nauthentication, an attacker may be able to guess the randomly-generated numbers\nand gain access to privileged data or features.\n\nMitigations\n-----------\n\n### General\n\n- Use [`java.security.SecureRandom`](/reference/java/security/SecureRandom) when there are *security implications*\n- Use [`java.util.Random`](/reference/java/util/Random) for any other cases\n- **Never** use [`Math.random`](/reference/java/lang/Math#random())!\n\n### java.security.SecureRandom\n\n**Recommended** for security uses. If the Linux kernel version is 5.17+ *or*\nblocking the thread is acceptable, wait for enough entropy to accumulate before\nyou generate the random numbers (i.e. use `/dev/random`). To do so, call\n`getInstanceStrong()`: \n\n### Kotlin\n\n val rand = SecureRandom.getInstanceStrong()\n\n### Java\n\n SecureRandom rand = SecureRandom.getInstanceStrong();\n\nOtherwise, on Linux kernel versions prior to 5.17 when blocking the thread is\nunacceptable when generating random numbers, then the `SecureRandom` constructor\nshould be called directly: \n\n### Kotlin\n\n import java.security.SecureRandom\n\n object generateRandom {\n @JvmStatic\n fun main(args: Array\u003cString\u003e) {\n // Create instance of SecureRandom class\n val rand = SecureRandom()\n\n // Generate random integers in range 0 to 999\n val rand_int = rand.nextInt(1000)\n\n // Use rand_int for security & authentication\n }\n }\n\n### Java\n\n import java.security.SecureRandom;\n\n public class generateRandom {\n\n public static void main(String args[])\n {\n // Create instance of SecureRandom class\n SecureRandom rand = new SecureRandom();\n\n // Generate random integers in range 0 to 999\n int rand_int = rand.nextInt(1000);\n\n // Use rand_int for security & authentication\n }\n }\n\n`SecureRandom` gets the default seed from `/dev/urandom`, and is automatically\nused when the object is constructed or obtained, so there is no need to\nexplicitly seed the PRNG. In general, any deterministic usage of `SecureRandom`\nis discouraged (especially if this leads to hard coding a seed value, which\nanyone decompiling the app can see). Developers who want to generate\nreproducible pseudorandom output should use more appropriate primitives such as\nHMAC, HKDF, and SHAKE.\n\n### java.util.Random\n\n**Avoid** for security / authentication purposes, acceptable to use for anything\nelse. \n\n### Kotlin\n\n import java.util.Random\n\n object generateRandom {\n @JvmStatic\n fun main(args: Array\u003cString\u003e) {\n // Create instance of SecureRandom class\n val rand = Random()\n\n // Generate random integers in range 0 to 999\n val rand_int = rand.nextInt(1000)\n }\n }\n\n### Java\n\n import java.util.Random;\n\n public class generateRandom {\n\n public static void main(String args[])\n {\n // Create instance of Random class\n Random rand = new Random();\n\n // Generate random integers in range 0 to 999\n int rand_int = rand.nextInt(1000);\n }\n }\n\nResources\n---------\n\n- [java.security.SecureRandom](/reference/java/security/SecureRandom)\n- [java.util.Random](/reference/java/util/Random)\n- [Math.random](/reference/java/lang/Math#random())\n- [Predictable Seed CWE](https://cwe.mitre.org/data/definitions/337.html)\n- [Cryptographically Weak PRNG CWE](https://cwe.mitre.org/data/definitions/338.html)\n- [Java Secure Random](https://www.baeldung.com/java-secure-random)\n- [Java Random versus SecureRandom](https://www.geeksforgeeks.org/random-vs-secure-random-numbers-java/)\n- [How to use SecureRandom](https://tersesystems.com/blog/2015/12/17/the-right-way-to-use-securerandom/)\n- [Python PRNG security guidance](https://rules.sonarsource.com/python/RSPEC-2245)\n- [OWASP Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html#secure-random-number-generation)\n- [CVE-2013-6386: Weak PRNG vuln in Drupal](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-6386)\n- [CVE-2006-3419: Weak PRNG vuln in Tor](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-3419)\n- [CVE-2008-4102: Predictable Seed in Joomla](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4102)\n- [Linux Kernel random patch](https://lwn.net/Articles/884875/)"]]