Согласно документации , различные алгоритмы, используемые 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
это хорошо для вашей цели.