Wie erstelle ich ein Array mit 20 zufälligen Bytes?

130

Wie kann ich in Java ein Array mit 20 zufälligen Bytes erstellen?

novicePrgrmr
quelle

Antworten:

277

Probieren Sie die Random.nextBytesMethode aus:

byte[] b = new byte[20];
new Random().nextBytes(b);
Maerics
quelle
46

Wenn Sie einen kryptografisch starken Zufallszahlengenerator (auch threadsicher) ohne Verwendung einer Drittanbieter-API benötigen, können Sie diesen verwenden SecureRandom .

Java 6 & 7:

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

Java 8 (noch sicherer):

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

Wenn Sie bereits Apache Commons Lang verwenden, RandomUtils ist dies ein Einzeiler:

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
quelle
8
Nach dem Graben verwendet RandomUtils Math.random () unter der Haube, nicht SecureRandom. Ich wollte das nur explizit machen.
Evo510
Diese Methode existiert nicht mehr.
Martijn Hiemstra
@MartijnHiemstra Es existiert: github.com/apache/commons-lang/blob/master/src/main/java/org/…
Duncan Jones
@DuncanJones Ich verwende Spring Boot 2, das Commons lang 3.7 verwendet und entfernt wurde. Das Anzeigen des Quellcodes zeigt, dass er auskommentiert wurde. Daher würde ich diesem Code nicht vertrauen, da ein Upgrade Ihren Code möglicherweise nicht kompilierbar macht.
Martijn Hiemstra
8

In Java 7 wurde ThreadLocalRandom eingeführt , das vom aktuellen Thread isoliert ist .

Dies ist eine weitere Wiedergabe der Maerics-Lösung .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
Jin Kwon
quelle
1
Vielleicht einige Klammern zu viele nach dem Wort ThreadLocalRandom? Besser:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt
4

Erstellen Sie ein zufälliges Objekt mit einem Startwert und erhalten Sie das Array zufällig, indem Sie Folgendes tun:

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 ツ
quelle
0

Für diejenigen, die einen sichereren Weg zum Erstellen eines zufälligen Byte-Arrays suchen, ist der sicherste Weg:

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

ABER Ihre Threads blockieren möglicherweise, wenn auf dem Computer je nach Betriebssystem nicht genügend Zufälligkeit verfügbar ist. Die folgende Lösung wird nicht blockiert:

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

Dies liegt daran, dass das erste Beispiel verwendet /dev/randomund blockiert, während auf mehr Zufälligkeit gewartet wird (generiert durch eine Maus / Tastatur und andere Quellen). Das zweite Beispiel verwendet, /dev/urandomdie nicht blockieren.

Tom Hage
quelle