Ist der SecureRandom
Faden sicher? Kann man sich nach der Initialisierung darauf verlassen, dass der Zugriff auf die nächste Zufallszahl threadsicher ist? Die Untersuchung des Quellcodes scheint zu zeigen, dass dies der Fall ist, und dieser Fehlerbericht scheint darauf hinzudeuten, dass die fehlende Dokumentation als threadsicher ein Javadoc-Problem ist. Hat jemand bestätigt, dass es tatsächlich threadsicher ist?
quelle
SecureRandom
kann nicht nur langsam sein, sondern möglicherweise aufgrund fehlender Entropie hängen bleibenDie aktuelle Implementierung von
SecureRandom
ist threadsicher, insbesondere die beiden Mutationsmethoden,nextBytes(bytes[])
undsetSeed(byte[])
wird synchronisiert.Soweit ich das beurteilen konnte, werden alle Mutationsmethoden schließlich durch diese beiden Methoden geleitet und
SecureRandom
überschreiben einige Methoden,Random
um dies sicherzustellen. Was funktioniert, aber spröde werden könnte, wenn die Implementierung in Zukunft geändert wird.Die beste Lösung besteht darin,
SecureRandom
zuerst die Instanz manuell zu synchronisieren . Dies bedeutet, dass jeder Aufrufstapel zwei Sperren für dasselbe Objekt erhält, was bei modernen JVMs normalerweise sehr billig ist. Das heißt, es schadet nicht, sich explizit zu synchronisieren. Beispielsweise:quelle
java.security.SecureRandom#nextBytes
in Java 8 ist nicht synchronisiert. Könnten Sie bitte angeben, in welcher Java-Version Sie eine synchronisierte gefunden haben#nextBytes
?