จะสร้างอาร์เรย์แบบสุ่ม 20 ไบต์ได้อย่างไร?


คำตอบ:



46

หากคุณต้องการตัวสร้างตัวเลขสุ่มที่มีการเข้ารหัสที่แข็งแกร่ง (รวมถึงเธรดที่ปลอดภัย) โดยไม่ต้องใช้ API ของบุคคลที่สามคุณสามารถใช้SecureRandom.

Java 6 และ 7:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

Java 8 (ปลอดภัยยิ่งขึ้น):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

16

หากคุณใช้ Apache Commons Lang อยู่แล้วสิ่ง RandomUtils นี้จะทำให้เป็นหนึ่งซับ:

byte[] randomBytes = RandomUtils.nextBytes(20);

8
หลังจากทำการขุดแล้ว RandomUtils ใช้ Math.random () ภายใต้ประทุนไม่ใช่ SecureRandom แค่อยากจะทำให้มันชัดเจน
Evo510

วิธีนี้ไม่มีอีกแล้ว
Martijn Hiemstra


@DuncanJones ฉันใช้ Spring boot 2 ที่ใช้ Commons lang 3.7 และมันถูกลบไปแล้ว การดูซอร์สโค้ดแสดงว่ามีการแสดงความคิดเห็น ดังนั้นฉันจะไม่เชื่อถือรหัสนี้เนื่องจากการอัปเกรดอาจทำให้รหัสของคุณไม่สามารถย่อยสลายได้
Martijn Hiemstra

8

Java 7 แนะนำThreadLocalRandomซึ่งเป็นแยกเธรดปัจจุบัน

นี่คือความหมายของอีกวิธีการแก้ปัญหาของ maerics

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);

1
อาจมีวงเล็บหลังคำมากเกินไปThreadLocalRandomหรือไม่ Better:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt

4

สร้างวัตถุสุ่มด้วยเมล็ดพันธุ์และรับอาร์เรย์แบบสุ่มโดยทำ:

public static final int ARRAY_LENGTH = 20;

byte[] byteArray = new byte[ARRAY_LENGTH];
new Random(System.currentTimeMillis()).nextBytes(byteArray);
// get fisrt element
System.out.println("Random byte: " + byteArray[0]);

0

สำหรับผู้ที่ต้องการวิธีที่ปลอดภัยยิ่งขึ้นในการสร้างอาร์เรย์ไบต์แบบสุ่มใช่วิธีที่ปลอดภัยที่สุดคือ:

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

แต่เธรดของคุณอาจปิดกั้นหากมีการสุ่มไม่เพียงพอในเครื่องทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการของคุณ วิธีแก้ปัญหาต่อไปนี้จะไม่ปิดกั้น:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

เนื่องจากตัวอย่างแรกใช้/dev/randomและจะบล็อกในขณะที่รอการสุ่มเพิ่มเติม (สร้างโดยเมาส์ / แป้นพิมพ์และแหล่งอื่น ๆ ) ตัวอย่างที่สองใช้/dev/urandomซึ่งจะไม่ปิดกั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.