Bagaimana cara membuat array dengan 20 byte acak?


Jawaban:



46

Jika Anda ingin generator nomor acak yang kuat secara kriptografis (juga aman untuk thread) tanpa menggunakan API pihak ketiga, Anda dapat menggunakannya SecureRandom.

Java 6 & 7:

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

Java 8 (bahkan lebih aman):

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

16

Jika Anda sudah menggunakan Apache Commons Lang, RandomUtils buat ini menjadi satu-baris:

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

8
Setelah melakukan penggalian, RandomUtils menggunakan Math.random () di bawah tenda, bukan SecureRandom. Hanya ingin membuat ini eksplisit.
Evo510

Metode ini tidak ada lagi.
Martijn Hiemstra


@DuncanJones Saya menggunakan boot Spring 2 yang menggunakan Commons lang 3.7 dan telah dihapus. Melihat kode sumber menunjukkan bahwa kode tersebut telah dikomentari. Jadi saya tidak akan mempercayai kode ini karena pemutakhiran mungkin membuat kode Anda tidak dapat dikompilasi.
Martijn Hiemstra

8

Java 7 memperkenalkan ThreadLocalRandom yang terisolasi ke utas saat ini .

Ini adalah terjemahan lain dari solusi maerics .

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

1
Mungkin beberapa tanda kurung terlalu banyak setelah kata ThreadLocalRandom? Lebih baik:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt

4

Buat objek acak dengan seed dan dapatkan array acak dengan melakukan:

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

Bagi mereka yang menginginkan cara yang lebih aman untuk membuat array byte acak, ya cara yang paling aman adalah:

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

TETAPI utas Anda mungkin memblokir jika tidak ada cukup keacakan pada mesin, tergantung pada OS Anda. Solusi berikut tidak akan memblokir:

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

Ini karena contoh pertama menggunakan /dev/randomdan akan memblokir sambil menunggu lebih banyak keacakan (dihasilkan oleh mouse / keyboard dan sumber lainnya). Contoh kedua menggunakan /dev/urandomyang tidak akan diblokir.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.