Come creare un array di 20 byte casuali?


Risposte:



46

Se desideri un generatore di numeri casuali crittograficamente potente (anche thread-safe) senza utilizzare un'API di terze parti, puoi utilizzare SecureRandom.

Java 6 e 7:

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

Java 8 (ancora più sicuro):

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

16

Se stai già utilizzando Apache Commons Lang, questo lo RandomUtils rende un one-liner:

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

8
Dopo aver scavato, RandomUtils utilizza Math.random () sotto il cofano, non SecureRandom. Volevo solo renderlo esplicito.
Evo510,

Questo metodo non esiste più.
Martijn Hiemstra,


@DuncanJones Sto usando Spring boot 2 che utilizza Commons Lang 3.7 ed è stato rimosso. La visualizzazione del codice sorgente mostra che è stato commentato. Quindi non mi fiderei di questo codice poiché un aggiornamento potrebbe rendere il tuo codice incompatibile.
Martijn Hiemstra,

8

Java 7 ha introdotto ThreadLocalRandom che è isolato dal thread corrente .

Questa è un'altra interpretazione della soluzione maerica .

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

1
Forse alcune parentesi troppe dopo la parola ThreadLocalRandom? Meglio:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt il

4

Crea un oggetto casuale con un seme e ottieni l'array casuale facendo:

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

Per coloro che desiderano un modo più sicuro per creare un array di byte casuali, sì, il modo più sicuro è:

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

MA i tuoi thread potrebbero bloccarsi se non c'è abbastanza casualità disponibile sulla macchina, a seconda del tuo sistema operativo. La seguente soluzione non bloccherà:

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

Questo perché il primo esempio usa /dev/randome bloccherà in attesa di maggiore casualità (generata da un mouse / tastiera e altre fonti). Il secondo esempio usa /dev/urandomche non si bloccherà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.