Bagaimana cara membuat array dengan 20 byte acak?

130

Bagaimana saya bisa membuat larik 20 byte acak di Jawa?

novicePrgrmr
sumber

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);
DavidR
sumber
16

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

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
sumber
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
@MartijnHiemstra Itu memang ada: github.com/apache/commons-lang/blob/master/src/main/java/org/…
Duncan Jones
@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);
Jin Kwon
sumber
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]);
ΦXocę 웃 Пepeúpa ツ
sumber
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.

Tom Hage
sumber