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/urandomdo pobrania kolejnych bajtów, ints, double, booleans, what-have-you.
Ponieważ /dev/randomblokuje (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/urandomzamiast 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/urandommoże zachowywać się inaczej .
Czy jest /dev/urandomwystarczająco losowy?
Konwencjonalna mądrość mówi, że tylko /dev/randomjest 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/urandomjest w porządku.