Zgodnie z dokumentacją różne algorytmy używane przez SecureRandom to, w kolejności preferencji:
- W większości systemów * NIX
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- W systemach Windows
- SHA1PRNG
- Windows-PRNG
Ponieważ pytałeś o Linuksa, ignoruję implementację Windows, a także SunPKCS11, który jest naprawdę dostępny tylko w Solarisie, chyba że sam go zainstalowałeś - a wtedy nie pytałbyś o to.
Według tej samej dokumentacji, czego używają te algorytmy
SHA1PRNG
Wstępne udostępnianie jest obecnie wykonywane za pomocą kombinacji atrybutów systemowych i urządzenia gromadzącego entropię java.security.
NativePRNG
nextBytes()
wykorzystuje /dev/urandom
generateSeed()
zastosowań/dev/random
NativePRNGBlocking
nextBytes()
i generateSeed()
używanie/dev/random
NativePRNGNonBlocking
nextBytes()
i generateSeed()
używanie/dev/urandom
Oznacza to, że jeśli używasz SecureRandom random = new SecureRandom()
, przegląda tę listę, dopóki nie znajdzie takiego, który działa, którym zazwyczaj będzie NativePRNG. A to oznacza, że wysiewa się z /dev/random
(lub używa tego, jeśli jawnie generujesz ziarno), a następnie używa /dev/urandom
do pobrania kolejnych bajtów, ints, double, booleans, what-have-you.
Ponieważ /dev/random
blokuje (blokuje, dopóki nie ma wystarczającej entropii w puli entropii), może to utrudnić działanie.
Jednym z rozwiązań jest użycie czegoś takiego jak haveged do wygenerowania wystarczającej entropii, a innym rozwiązaniem jest użycie /dev/urandom
zamiast tego. Chociaż można to ustawić dla całej jvm, lepszym rozwiązaniem jest zrobienie tego dla tego konkretnego wystąpienia SecureRandom
, używając SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")
. Należy pamiętać, że ta metoda może zgłosić NoSuchAlgorithmException, jeśli NativePRNGNonBlocking, więc przygotuj się na powrót do wartości domyślnej.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
Zauważ również, że w innych systemach * nix /dev/urandom
może zachowywać się inaczej .
Czy jest /dev/urandom
wystarczająco losowy?
Konwencjonalna mądrość mówi, że tylko /dev/random
jest wystarczająco przypadkowa. Jednak niektóre głosy się różnią. W „Właściwy sposób korzystania z SecureRandom” i „Mity o / dev / urandom” argumentowano, że /dev/urandom/
jest to równie dobre.
Zgadzają się z tym użytkownicy na stosie bezpieczeństwa informacji . Zasadniczo, jeśli musisz o to zapytać, /dev/urandom
jest w porządku.