شعار PRNG ضعيف
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
فئة OWASP: MASVS-CRYPTO: التشفير
نظرة عامة
منشئ الأرقام الزائفة (PRNG) هو خوارزمية تُنشئ
تسلسلات أرقام يمكن التنبؤ بها بناءً على قيمة أولية تُسمى العنصر الأساسي. تمتلك تسلسل الأرقام الذي يتم إنشاؤه باستخدام "مولد الأرقام العشوائية التقدّمي" تقريبًا الخصائص نفسها التي يمتلكها تسلسل الأرقام العشوائية الحقيقية، ولكنّه أسرع وأقل تكلفة من حيث العمليات الحسابية
لإنشائه.
بعبارة أخرى، توفّر مصادر الأرقام العشوائية التقدّمي ضمانات أعلى من مصادر الأرقام العشوائية الضعيفة (مثل
java.math.Random
) من حيث توازن توزيع المعلومات العشوائية، ما يحاكي
تسلسلات الأرقام العشوائية حقًا. تتطلّب عملية إنشاء الأرقام العشوائية حقًا استخدام
معدّات متخصّصة، وغالبًا ما تكون خارج نطاق التطوير العادي. لا يتناول
هذا المستند إنشاء أرقام عشوائية حقًا، بل يركز فقط على
الأرقام العشوائية الحقيقية لأنّها المنهجية العادية المستخدَمة.
تحدث ثغرات PRNG الضعيفة عندما يستخدم المطورون رقم PRNG عاديًا
أغراض التشفير، بدلاً من استخدام PRNG (CSPRNG) مؤمن بالتشفير.
تفرض مولدات الأرقام العشوائية الآمنة للخدمات متطلبات أكثر صرامة، ويجب أن تمنح المولدات المُهاجمين ميزة بسيطة فقط عند عدم معرفة البذرة في ما يتعلّق بالتمييز بين تسلسل الإخراج وتسلسل عشوائي فعلي.
وقد يتمكن المهاجمون أيضًا من تخمين تسلسل الأرقام الذي يتم إنشاؤه عندما
تُستخدم البذور التي يمكن التنبؤ بها، مثل البذور الثابتة التي تم تشفيرها بواسطة المطوّر، في
تهيئة PRNG أو CSPRNG، حيث يمكن للمهاجم تخمين البذور وبالتالي التنبؤ
المخرجات الناتجة عن PRNG.
التأثير
في حال استخدام مولد أعداد عشوائية غير آمن من الناحية التشفيرية في سياق أمان مثل
المصادقة، قد يتمكّن المهاجم من تخمين الأرقام التي يتم إنشاؤها عشوائيًا
والوصول إلى البيانات أو الميزات المميّزة.
إجراءات التخفيف
بنود عامة
java.security.SecureSpam.
يُنصح به للاستخدامات الأمنية. إذا كان إصدار نواة Linux هو 5.17 أو إصدار أحدث أو كان حظر سلسلة المهام مقبولًا، انتظِر حتى تتراكم كمية كافية من التشويش قبل توليد الأرقام العشوائية (أي استخدام /dev/random
). لإجراء ذلك، استخدِم getInstanceStrong()
:
Kotlin
val rand = SecureRandom.getInstanceStrong()
Java
SecureRandom rand = SecureRandom.getInstanceStrong();
بخلاف ذلك، في إصدارات نواة Linux التي يسبقها الإصدار 5.17، عندما يكون حظر سلسلة المهام
غير مقبول عند إنشاء أرقام عشوائية، يجب استدعاء SecureRandom
constructor
مباشرةً:
Kotlin
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
}
}
Java
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
، ويتم استخدامها تلقائيًا عند إنشاء العنصر أو الحصول عليه، لذا ليس من الضروري تحديد بذرة مولد الأعداد العشوائية بشكل صريح. بشكل عام، أي استخدام حاسم لـ SecureRandom
لا يوصى به (خاصةً إذا كان ذلك يؤدي إلى الترميز الثابت لقيمة أوّلية، وهو ما
يتمكن أي شخص يقوم بفك تجميع التطبيق) برؤيتها). المطوِّرون الذين يريدون إنشاء
يجب أن يستخدم الناتج الزائف القابل للتكرار خطوات أولية أكثر ملاءمة مثل
وHMAC وHKDF وSHAKE.
برنامج java.util.Spam
تجنَّب استخدامها لأغراض الأمان أو المصادقة، ولكن يُسمح باستخدامها لأغراض أخرى.
Kotlin
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)
}
}
Java
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);
}
}
المراجع
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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/)"]]