O SecureRandom
tópico é seguro? Ou seja, após inicializá-lo, o acesso ao próximo número aleatório pode ser considerado seguro para threads? Examinar o código-fonte parece mostrar que sim, e este relatório de bug parece indicar que a falta de documentação como thread-safe é um problema do javadoc. Alguém confirmou que é de fato thread-safe?
fonte
SecureRandom
pode não apenas ser lenta, mas pode travar devido à falta de entropiaA implementação atual do
SecureRandom
é thread-safe, especificamente os dois métodos mutantesnextBytes(bytes[])
esetSeed(byte[])
são sincronizados.Bem, pelo que pude perceber, todos os métodos mutantes são eventualmente roteados por meio desses dois métodos e
SecureRandom
substituem alguns métodosRandom
para garantir isso. Que funciona, mas pode ser frágil se a implementação for alterada no futuro.A melhor solução é sincronizar manualmente na
SecureRandom
instância primeiro. Isso significa que cada pilha de chamadas adquirirá dois bloqueios no mesmo objeto, mas isso geralmente é muito barato em JVMs modernos. Ou seja, não há muito mal em se sincronizar explicitamente. Por exemplo:fonte
java.security.SecureRandom#nextBytes
no Java 8 não está sincronizado. Você poderia especificar em qual versão do Java você encontrou um sincronizado#nextBytes
?