Згідно з документацією , різні алгоритми, які використовуються 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це добре для ваших цілей.