Jak stworzyć tablicę 20 losowych bajtów?

133

Jak mogę utworzyć tablicę 20 losowych bajtów w Javie?

nowicjuszPrgrmr
źródło

Odpowiedzi:

47

Jeśli chcesz mieć silny kryptograficznie generator liczb losowych (również bezpieczny wątkowo) bez korzystania z interfejsu API innej firmy, możesz użyć SecureRandom.

Java 6 i 7:

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

Java 8 (jeszcze bezpieczniejsza):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);
DavidR
źródło
18

Jeśli korzystasz już z Apache Commons Lang, to RandomUtils sprawia , że jest to jedna linijka:

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
źródło
9
Po wykonaniu kilku poszukiwań RandomUtils używa Math.random () pod maską, a nie SecureRandom. Chciałem tylko wyrazić to wyraźnie.
Evo510
Ta metoda już nie istnieje.
Martijn Hiemstra
1
@MartijnHiemstra To istnieje: github.com/apache/commons-lang/blob/master/src/main/java/org/…
Duncan Jones
@DuncanJones Używam Spring boot 2, który używa Commons lang 3.7 i został usunięty. Przeglądanie kodu źródłowego pokazuje, że został on skomentowany. Więc nie ufałbym temu kodowi, ponieważ aktualizacja może spowodować, że Twój kod będzie niekompilowalny.
Martijn Hiemstra
@MartijnHiemstra Sprawdziłem najnowsze dokumenty na: commons.apache.org/proper/commons-lang/apidocs/index.html, a także dokumenty do wersji 3.7 na: commons.apache.org/proper/commons-lang/javadocs/api -3.7 / org /… Wydaje się, że oba mają metodę nextBytes. Może spring boot nie importuje poprawnych bibliotek?
Waleed
8

Java 7 wprowadziła ThreadLocalRandom, który jest odizolowany od bieżącego wątku .

To kolejna interpretacja rozwiązania Maerics .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
Jin Kwon
źródło
1
Może za dużo nawiasów po słowie ThreadLocalRandom? Lepiej:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt
4

Utwórz obiekt Random z ziarnem i uzyskaj tablicę losowo, wykonując:

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 ツ
źródło
0

Dla tych, którzy chcą bezpieczniejszego sposobu tworzenia losowej tablicy bajtów, tak, najbezpieczniejszym sposobem jest:

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

ALE twoje wątki mogą blokować się, jeśli na komputerze nie ma wystarczającej ilości losowości, w zależności od systemu operacyjnego. Poniższe rozwiązanie nie będzie blokować:

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

Dzieje się tak, ponieważ pierwszy przykład używa /dev/randomi będzie blokował podczas oczekiwania na większą losowość (generowaną przez mysz / klawiaturę i inne źródła). Drugi przykład używa, /dev/urandomktóre nie będą blokować.

Tom Hage
źródło