ตามเอกสารประกอบอัลกอริทึมที่แตกต่างกันที่ใช้โดย SecureRandom คือตามลำดับของการตั้งค่า:
- บนระบบ * NIX ส่วนใหญ่
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- บนระบบ Windows
- SHA1PRNG
- ใช้ Windows PRNG
เมื่อคุณถามเกี่ยวกับ Linux ฉันจะเพิกเฉยต่อการติดตั้ง Windows และ SunPKCS11 ซึ่งมีเฉพาะใน Solaris เท่านั้นเว้นแต่คุณจะติดตั้งด้วยตัวคุณเองแล้วคุณจะไม่ถามคำถามนี้
ตามเอกสารเดียวกันเหล่านั้นขั้นตอนวิธีการเหล่านี้ใช้คืออะไร
SHA1PRNG การ
เริ่มต้นเริ่มต้นทำได้ในขณะนี้ผ่านการรวมกันของคุณสมบัติของระบบและอุปกรณ์รวบรวมเอนโทรปีของ java.security
NativePRNG
nextBytes()
ใช้การ/dev/urandom
generateSeed()
ใช้งาน/dev/random
NativePRNGBlocking
nextBytes()
และการgenerateSeed()
ใช้งาน/dev/random
NativePRNGNon การล็อค
nextBytes()
และการgenerateSeed()
ใช้งาน/dev/urandom
ซึ่งหมายความว่าถ้าคุณใช้SecureRandom random = new SecureRandom()
มันจะลงรายการนั้นจนกว่าจะพบรายการที่ใช้งานได้ซึ่งโดยทั่วไปจะเป็น NativePRNG และนั่นหมายความว่ามันเมล็ดตัวเองจาก/dev/random
(หรือใช้ว่าถ้าคุณสร้างเมล็ดอย่างชัดเจน) จากนั้นใช้/dev/urandom
สำหรับการรับไบต์ถัดไป, ints, double, booleans สิ่งที่มีคุณ
เนื่องจาก/dev/random
กำลังบล็อก (จะบล็อกจนกว่าจะมีเอนโทรปีเพียงพอในพูลเอนโทรปี) ซึ่งอาจขัดขวางประสิทธิภาพการทำงาน
วิธีแก้ปัญหาหนึ่งที่ใช้สิ่งที่ต้องการได้สร้างเอนโทรปีเพียงพอโซลูชั่นอื่นใช้/dev/urandom
แทน ในขณะที่คุณสามารถตั้งค่าว่าสำหรับ JVM ทั้งเป็นทางออกที่ดีจะทำมันเช่นนี้เฉพาะโดยใช้SecureRandom
SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
โปรดทราบว่าวิธีการที่สามารถโยน NoSuchAlgorithmException ถ้า NativePRNGNonBlocking ดังนั้นได้เตรียมที่จะย้อนกลับไปเริ่มต้น
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
นอกจากนี้ทราบว่าในระบบระวัง * อื่น ๆอาจจะทำงานแตกต่างกัน/dev/urandom
คือ/dev/urandom
สุ่มเพียงพอหรือไม่
ภูมิปัญญาดั้งเดิมมีเพียงว่ามัน/dev/random
สุ่มพอ อย่างไรก็ตามเสียงบางอย่างแตกต่างกัน ใน"วิธีที่ถูกต้องในการใช้ SecureRandom"และ"Myths about / dev / urandom"เป็นที่ถกเถียงกันอยู่ว่า/dev/urandom/
ดี
ผู้ใช้มากกว่าในการรักษาความปลอดภัยข้อมูลสแต็คเห็นด้วยกับที่ โดยทั่วไปถ้าคุณต้องถาม/dev/urandom
ก็ดีสำหรับวัตถุประสงค์ของคุณ