Comment créer un tableau de 20 octets aléatoires?

130

Comment créer un tableau de 20 octets aléatoires en Java?

novicePrgrmr
la source

Réponses:

46

Si vous voulez un générateur de nombres aléatoires cryptographiquement fort (également thread-safe) sans utiliser une API tierce, vous pouvez utiliser SecureRandom.

Java 6 et 7:

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

Java 8 (encore plus sécurisé):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);
DavidR
la source
16

Si vous utilisez déjà Apache Commons Lang, RandomUtils cela en fait un one-liner:

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
la source
8
Après avoir creusé, RandomUtils utilise Math.random () sous le capot, pas SecureRandom. Je voulais juste rendre cela explicite.
Evo510
Cette méthode n'existe plus.
Martijn Hiemstra
@MartijnHiemstra Cela existe: github.com/apache/commons-lang/blob/master/src/main/java/org
Duncan Jones
@DuncanJones J'utilise Spring boot 2 qui utilise la lang 3.7 de Commons et il a été supprimé. L'affichage du code source montre qu'il a été commenté. Je ne ferais donc pas confiance à ce code car une mise à niveau pourrait rendre votre code non compilable.
Martijn Hiemstra
8

Java 7 a introduit ThreadLocalRandom qui est isolé du thread actuel .

Ceci est une autre interprétation de la solution de maerics .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
Jin Kwon
la source
1
Peut-être que quelques parenthèses sont trop nombreuses après le mot ThreadLocalRandom? Mieux:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt
4

Créez un objet Random avec une graine et obtenez le tableau au hasard en faisant:

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 ツ
la source
0

Pour ceux qui veulent un moyen plus sûr de créer un tableau d'octets aléatoires, oui, le moyen le plus sûr est:

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

MAIS vos threads peuvent se bloquer s'il n'y a pas assez d'aléa disponible sur la machine, en fonction de votre système d'exploitation. La solution suivante ne bloquera pas:

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

C'est parce que le premier exemple utilise /dev/randomet bloquera en attendant plus de hasard (généré par une souris / clavier et d'autres sources). Le deuxième exemple utilise /dev/urandomqui ne bloquera pas.

Tom Hage
la source