Czy SecureRandom
wątek jest bezpieczny? To znaczy, po zainicjowaniu go, czy można uzyskać dostęp do następnego losowego numeru, aby był bezpieczny dla wątków? Badanie kodu źródłowego zdaje się wskazywać, że tak jest, i this bug report wydaje się wskazywać, że jego brak dokumentacji jako bezpiecznego wątku jest problemem javadoc. Czy ktoś potwierdził, że w rzeczywistości jest bezpieczny dla wątków?Czy bezpieczny wątek SecureRandom jest bezpieczny?
Odpowiedz
Tak, jest. Rozciąga Random
, który zawsze miał faktyczną realizację threadsafe, a od Java 7, explicitly guarantees threadsafety.
Jeżeli wiele wątków są za pomocą pojedynczego SecureRandom
, nie może być twierdzenie, że boli wydajność. Z drugiej strony inicjowanie instancji SecureRandom
może być stosunkowo powolne. To, czy najlepiej jest dzielić się globalnym RNG, czy utworzyć nowy dla każdego wątku, będzie zależeć od twojej aplikacji. Klasa ThreadLocalRandom
może być używana jako wzorzec do dostarczania rozwiązania obsługującego SecureRandom
.
Tak. Jest całkowicie bezpieczny dla wątków. Właściwie to narzekałbym, że zamek jest zbyt agresywny. Całość engineNextBytes()
jest zsynchronizowana.
Szczerze mówiąc, nie wiedziałbym, czy to nie jest bezpieczne. Zagadnienie wątków prawdopodobnie wprowadza więcej losowości :)
To * Bezpieczne * Losowe, bardzo ważne jest, aby używać go dokładnie. Nie sądzę, że wprowadza większą losowość. Na przykład. Bezpieczny losowy wątek może wytworzyć tę samą losową liczbę w kilku wątkach - może to oznaczać, że jeden wątek mógłby ukraść liczbę wygenerowaną dla innego wątku, może zostać wykorzystany przez hakera. – kan
Obecna implementacja SecureRandom
jest bezpieczna dla wątków, w szczególności dwie metody mutowania nextBytes(bytes[])
i setSeed(byte[])
są zsynchronizowane.
Cóż, o ile mogłem powiedzieć, wszystkie metody mutacji są ostatecznie kierowane przez te dwie metody, i SecureRandom
przesłania kilka metod w Random
, aby to zapewnić. Który działa, ale może być kruchy, jeśli implementacja zostanie zmieniona w przyszłości.
Najpierw należy ręcznie przeprowadzić synchronizację na instancji SecureRandom
. Oznacza to, że każdy stos wywołań zyska dwie blokady na tym samym obiekcie, ale zazwyczaj jest to bardzo tanie w nowoczesnych maszynach JVM. Oznacza to, że nie ma wiele szkód w jednoznacznym synchronizowaniu się. Na przykład:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}
- 1. Czy wątek console.writeline jest bezpieczny?
- 2. Czy wątek Joiner jest bezpieczny?
- 3. Czy wątek libuv jest bezpieczny?
- 4. Czy wątek RNGCryptoServiceProvider.GetBytes jest bezpieczny?
- 5. Czy wątek NSFileManager jest bezpieczny?
- 6. jest bezpieczny wątek DatagramSocket.send?
- 7. Czy bezpieczny wątek String.intern()
- 8. Czy C# "??" Czy wątek operatora jest bezpieczny?
- 9. Czy wątek java.util.Calendar jest bezpieczny czy nie?
- 10. Czy ten wątek klasy Java jest bezpieczny?
- 11. Czy wątek jest bezpieczny dla wątków SLF4J?
- 12. Czy wątek TelemetryClient Application Insight jest bezpieczny?
- 13. Czy wątek protobuf-net jest bezpieczny?
- 14. Delphi - czy wątek TClientDataset jest bezpieczny?
- 15. Czy wątek TADOConnection Delphi jest bezpieczny?
- 16. .NET - Czy wątek metody Queue.Enqueue jest bezpieczny?
- 17. Czy wątek armadillo solve() jest bezpieczny?
- 18. Czy wątek Netty Channel.write jest bezpieczny?
- 19. Czy ten wątek pomocniczy html jest bezpieczny?
- 20. Czy ten wątek użycia blokady jest bezpieczny?
- 21. Czy wątek CertificateFactory.getInstance ("x.509") jest bezpieczny?
- 22. BroadcastReceiver onReceive() wątek bezpieczny?
- 23. Wątek bezpieczny stos C++
- 24. Bezpieczny wątek unique_ptr move
- 25. java.text.SimpleDateFormat nie wątek bezpieczny
- 26. Czy wątek trojański (? :) wątek jest bezpieczny w C#?
- 27. HtmlUnit: jeden WebClient na wątek - czy wątek jest bezpieczny?
- 28. W SignalR jest Hub.Context wątek bezpieczny?
- 29. Czy program Win32 rejestruje wątek bezpieczny?
- 30. Wątek bezpieczny Singletons w Javie
Dziękujemy za aktualizację. Dziwnie, błąd jest oznaczony jako zamknięty, "nie naprawi". Ale i tak to naprawili. No cóż, nie zazdroszczę im wielkości ich bazy danych błędów. – Yishai
Inicjalizacja 'SecureRandom' może być nie tylko powolna, ale może się zawiesić z powodu braku entropii –
@WalterTross Hang? Widziałem, że systemy zabierają 10 lub 15 minut, ale nigdy nie widziałem, żeby ktoś wisiał. Implementacja, która nie gwarantuje kontynuacji zasilania puli entropii, choć powoli, wydaje się być błędem w systemie operacyjnym. – erickson