Czy SecureRandom
wątek jest bezpieczny? To znaczy, czy po jego zainicjowaniu można polegać na dostępie do następnej liczby losowej, aby był bezpieczny dla wątków? Badanie kodu źródłowego wydaje się wskazywać, że tak jest, a ten raport o błędzie wydaje się wskazywać, że brak dokumentacji jako bezpiecznej dla wątków jest problemem javadoc. Czy ktoś potwierdził, że faktycznie jest bezpieczny wątkowo?
źródło
SecureRandom
może nie tylko być powolna, ale może potencjalnie zawiesić się z powodu brakującej entropiiObecna implementacja
SecureRandom
jest bezpieczna dla wątków, w szczególności dwie metody mutowanianextBytes(bytes[])
isetSeed(byte[])
są zsynchronizowane.O ile mogłem stwierdzić, wszystkie metody mutowania są ostatecznie kierowane przez te dwie metody i
SecureRandom
zastępują kilka metod,Random
aby to zapewnić. Co działa, ale może być kruche, jeśli implementacja zostanie zmieniona w przyszłości.Najlepszym rozwiązaniem jest
SecureRandom
najpierw ręczna synchronizacja na instancji. Oznacza to, że każdy stos wywołań uzyska dwie blokady na tym samym obiekcie, ale jest to zwykle bardzo tanie w nowoczesnych maszynach JVM. Oznacza to, że jawna synchronizacja się nie szkodzi. Na przykład:źródło
java.security.SecureRandom#nextBytes
w Javie 8 nie jest zsynchronizowany. Czy możesz określić, w której wersji Java znalazłeś zsynchronizowany plik#nextBytes
?