Згідно з документацією , різні алгоритми, які використовуються SecureRandom, є в порядку уподобання:
- У більшості * NIX систем
- NativePRNG
- SHA1PRNG
- NativePRNGBблокування
- NativePRNGNonBlocking
- У системах Windows
- SHA1PRNG
- Windows-PRNG
Оскільки ви запитували про 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
для отримання наступних байтів, ints, double, booleans, what-have -s.
Оскільки /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
це добре для ваших цілей.