Jak stworzyć tablicę 20 losowych bajtów?


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

18

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

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

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


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

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

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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.