Каждое поколение SecureRandom
отбирается из некоторого энтропийного пула. В зависимости от используемой ОС, это может быть пул энтропии, поддерживаемый ОС, такой как /dev/random
в Linux, или что-то, что JVM создает. В некоторых более ранних реализациях Sun JVM использовала для порождения нескольких потоков и использования их временных данных для создания начального числа.
Создание нового SecureRandom
при каждом вызове может привести к замедлению работы приложения, поскольку создание начального числа может блокировать. Лучше повторно использовать статически созданный экземпляр, но обязательно повторно заполнить его после того, как из него извлечено случайное число фиксированных чисел.
Возможно, вы захотите создать оболочку для экземпляра SecureRandom
, которая будет подсчитывать количество байтов, извлеченных при вызовах nextBytes
или generateSeed
, а после количества байтов повторно заполнить внутренний экземпляр SecureRandom
с помощью системной энтропии. бассейн.
Подход обертки, однако, невозможен на Java в Linux, поскольку экземпляр SecureRandom
, который вы получаете от
new SecureRandom()
- это просто оболочка для /dev/random
, и каждый вызов nextBytes
или generateSeed
фактически истощает пул энтропии ОС. В Linux и Solaris лучше использовать провайдера JCE для создания SecureRandom
.