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


Antworten:



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);

16

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

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

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


@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);

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]);

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.