Согласно документации , различные алгоритмы, используемые SecureRandom, в порядке предпочтения:
- В большинстве * систем NIX
- NativePRNG
- SHA1PRNG
- NativePRNGBlocking
- NativePRNGNonBlocking
- В системах Windows
- SHA1PRNG
- Окна-ПСЧ
Поскольку вы спрашивали о Linux, я игнорирую реализацию Windows, а также SunPKCS11, который действительно доступен только в Solaris, если вы не установили его самостоятельно - и тогда вы не будете спрашивать этого.
Согласно той же документации, эти алгоритмы
SHA1PRNG
Первоначальное в настоящее время выполняется с помощью комбинации системных атрибутов и устройства сбора энтропии java.security.
NativePRNG
nextBytes() использует /dev/urandom
generateSeed()использует/dev/random
NativePRNGB блокировка
nextBytes() и generateSeed()использование/dev/random
NativePRNGNonBlocking
nextBytes() иgenerateSeed() использование/dev/urandom
Это означает, что если вы используете SecureRandom random = new SecureRandom(), он идет вниз по этому списку, пока не найдет тот, который работает, который обычно будет NativePRNG. И это означает, что он берет /dev/randomначало (или использует это, если вы явно генерируете семена), а затем использует/dev/urandom берет начало для получения следующих байтов, целых, двойных, логических значений, что у вас есть.
Так как /dev/randomэто блокировка (она блокирует, пока у нее не будет достаточно энтропии в пуле энтропии), это может снизить производительность.
Одним из решений этого является использование чего-то вроде hasged для генерации достаточного количества энтропии, /dev/urandomвместо этого используется другое решение . Хотя вы можете установить это для всего jvm, лучшим решением будет сделать это для этого конкретного случая SecureRandom, используя SecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking"). Обратите внимание, что этот метод может генерировать исключение NoSuchAlgorithmException, если NativePRNGNonBlocking, поэтому будьте готовы к откату до значения по умолчанию.
SecureRandom random;
try {
random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
random = new SecureRandom();
}
Также обратите внимание, что в других системах * nix /dev/urandomможет вести себя по-разному .
/dev/urandomДостаточно ли случайно?
Обычная мудрость гласит, что /dev/randomэто достаточно случайно. Однако некоторые голоса отличаются. В «Правильном способе использования SecureRandom» и «Мифах о / dev / urandom» утверждается, что /dev/urandom/это так же хорошо.
Пользователи стека информационной безопасности согласны с этим . В принципе, если вам нужно спросить, /dev/urandomэто хорошо для вашей цели.