PRNG ไม่ดี
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
หมวดหมู่ OWASP: MASVS-CRYPTO: วิทยาการเข้ารหัสลับ
ภาพรวม
โปรแกรมสร้างตัวเลขสุ่ม (PRNG) เป็นอัลกอริทึมที่สร้าง
ลำดับตัวเลขที่คาดการณ์ได้ตามค่าเริ่มต้นที่เรียกว่า seed ต
ลำดับตัวเลขที่ PRNG สร้างขึ้นมีพร็อพเพอร์ตี้โดยประมาณเหมือนกับ
ลำดับตัวเลขแบบสุ่มอย่างแท้จริง แต่เร็วกว่าและประหยัดในการคำนวณ
ในการสร้าง
กล่าวคือ PRNG มีความน่าเชื่อถือสูงกว่า RNG แบบอ่อน (เช่น java.math.Random
) ในแง่ความสม่ำเสมอของการแจกแจงข้อมูลความผันผวน ซึ่งจำลองลำดับตัวเลขแบบสุ่มอย่างแท้จริง การสร้างตัวเลขแบบสุ่มที่แท้จริงจำเป็นต้องใช้
อุปกรณ์พิเศษและมักจะอยู่นอกขอบเขตของการพัฒนาตามปกติ ช่วงเวลานี้
เอกสารไม่ครอบคลุมการสร้างตัวเลขแบบสุ่มอย่างแท้จริง และมุ่งเน้นที่
PRNG เนื่องจากเป็นวิธีการมาตรฐานที่ใช้
ช่องโหว่ PRNG ที่อ่อนเกิดขึ้นเมื่อนักพัฒนาซอฟต์แวร์ใช้ PRNG ปกติสำหรับ
จุดประสงค์ในการเข้ารหัส แทน PRNG ที่ปลอดภัยแบบเข้ารหัสลับ (CSPRNG)
CSPRNG มีข้อกำหนดที่เข้มงวดกว่า และเมื่อไม่ทราบข้อมูลเมล็ดพันธุ์ ข้อมูลดังกล่าวต้องให้ข้อได้เปรียบที่ไม่สําคัญต่อผู้โจมตีในการแยกแยะลําดับเอาต์พุตออกจากลําดับแบบสุ่มจริง
ผู้โจมตีอาจเดาลำดับตัวเลขที่สร้างขึ้นได้ด้วยเมื่อใช้เมล็ดพันธุ์ที่คาดเดาได้ เช่น เมล็ดพันธุ์ที่นักพัฒนาซอฟต์แวร์เขียนโค้ดไว้อย่างเจาะจง เพื่อเริ่มต้น PRNG หรือ CSPRNG เนื่องจากผู้โจมตีสามารถเดาเมล็ดพันธุ์และคาดเดาเอาต์พุตที่ PRNG สร้างขึ้นได้
ผลกระทบ
หากมีการใช้ PRNG ที่ไม่มีการเข้ารหัสลับในบริบทด้านความปลอดภัย เช่น
อาจทำให้ผู้โจมตีคาดเดาตัวเลขที่สร้างขึ้นแบบสุ่มได้
และรับสิทธิ์เข้าถึงข้อมูลหรือฟีเจอร์ที่เป็นสิทธิ์เฉพาะบุคคล
การลดปัญหา
ทั่วไป
java.security.SecureRandom
แนะนำสำหรับการใช้งานด้านความปลอดภัย หากเคอร์เนล Linux เป็นเวอร์ชัน 5.17 ขึ้นไป หรืออนุญาตให้บล็อกเธรดได้ ให้รอให้ข้อมูลสุ่มสะสมมากพอก่อนที่จะสร้างตัวเลขสุ่ม (เช่น ใช้ /dev/random
) โดยเรียกใช้ getInstanceStrong()
ดังนี้
Kotlin
val rand = SecureRandom.getInstanceStrong()
Java
SecureRandom rand = SecureRandom.getInstanceStrong();
หรือในเคอร์เนล Linux เวอร์ชันก่อน 5.17 เมื่อบล็อกเธรดเพื่อสร้างเลขสุ่มไม่ได้ คุณควรเรียกSecureRandom
คอนสตรัคเตอร์ SecureRandom
โดยตรง ดังนี้
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
และจะดำเนินการโดยอัตโนมัติ
ใช้เมื่อมีการสร้างหรือได้วัตถุนั้นขึ้น ดังนั้นจึงไม่จำเป็นต้อง
ตั้ง PRNG อย่างชัดเจน โดยทั่วไปแล้ว การใช้งานเชิงกำหนดของ SecureRandom
(โดยเฉพาะอย่างยิ่งถ้าวิธีนี้นำไปสู่ การฮาร์ดโค้ดค่าตั้งต้น ซึ่ง
ทุกคนที่คอมไพล์แอปจะเห็น) นักพัฒนาแอปที่ต้องการสร้างเอาต์พุตแบบสุ่มจำลองที่ซ้ำกันได้ควรใช้องค์ประกอบพื้นฐานที่เหมาะสมกว่า เช่น HMAC, HKDF และ SHAKE
java.util.Random
หลีกเลี่ยง เพื่อวัตถุประสงค์ด้านความปลอดภัย / การตรวจสอบสิทธิ์ ซึ่งใช้ได้หลายวัตถุประสงค์
ทั้งหมด
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 UTC
[[["เข้าใจง่าย","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 UTC"],[],[],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/)"]]