Ускорение SecureRandom в Java: обход блокировки /dev/random
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для увеличения скорости работы SecureRandom
примените более быстрый неблокирующий источник /dev/urandom
, создавая экземпляр при помощи new SecureRandom()
. Для улучшения производительности SecureRandom
инициализируйте его асинхронно, устанавливая семя.
SecureRandom srFast = new SecureRandom(); // Для повышения скорости выполнения.
Утверждение на уровне JVM также может ускорить процесс:
-Djava.security.egd=file:/dev/./urandom // Увеличиваем скорость генерации
Погружение в устройство urandom
Использование /dev/urandom
обеспечивает скорость, но важно знать, как это работает, чтобы обеспечить безопасность ваших конфиденциальных данных. Создание экземпляра SecureRandom
без использование аргументов автоматически подключает этот подход. Если вы требуете более высокой степени энтропии, например, для выполнения криптографических операций, рекомендуется явно определить источник семени для SecureRandom
.
byte[] seed = someSecureSource.getBytes();
srFast.setSeed(seed); // Увеличение уровня энтропии!
Отказ от зависимости от блокировки
Минимизировать зависимость от блокировок, регулярно обновляя энтропию, чтобы не замедлять работу вашей программы. Постоянно применяйте метод setSeed()
для обновления семени SecureRandom в фоновом режиме.
Визуализация
Вообразите SecureRandom как трудящегося работника, который медленно наполняет ведро (случайностью).
[🔒💧] -> [🪣🕒] # SecureRandom медленно наполняет ведро случайностью
Устройтесь удобнее с чашкой кофе и позвольте кешированию или неблокирующему сеиванию переключиться на эту работу.
| Метод | Результат |
| ---------------------------- | ------------------------ |
| Кеширование ведра (🪣) | 🚀 Выполнение задачи |
| Не фазирующее пресеивание (🔄)| ⏩ Бесперебойная работа |
В результате, ваше приложение обретает непрерывный поток случайности:
[🔒💧] -> [🪣🚀] [🪣⏩] # Непрерывное получение случайности без ожидания.
Выберите стратегию генерации случайных чисел с учетом потребностей вашего приложения!
Основная проблема
Рассмотрим вопросы производительности, связанные с SecureRandom
:
- Сравнение /dev/random и /dev/urandom: Использование
/dev/random
, может затянуться во времени, в отличие от/dev/urandom
, который всегда готов к работе. - Выбор алгоритма:
SecureRandom.getInstance('SHA1PRNG')
предлагает сочетание скорости и надёжности. - Нетривиальные ошибки с серьёзными последствиями: Известный неполадка Java Bug 6202721 влияет на производительность
SecureRandom
.
SecureRandom srFastButSafe = SecureRandom.getInstance("SHA1PRNG"); // Быстро и безопасно.
Альтернативные решения
Есть альтернативные подходы:
- Для некриптографических операций можно использовать надежные семена для повышения скорости.
- Временами использование
Uncommon Maths
может попираться на самолюбии и зависить от внешних факторов. Но SecureRandom работает в собственном ритме.
Поиск баланса
При поискам баланса между производительностью и безопасностью, выбор источники энтропии становится основополагающим:
- Сравнение
/dev/random
с/dev/urandom
: Random более безопасен, но может замедлить работу, в тоже время urandom менее надежен, но работает быстрее. - Стратегии семян: Поддержание высокого уровня энтропии обеспечивается регулярным обновлением семян.
Полезные материалы
- Руководство по архитектуре криптографии в Java (JCA) — Ваш помощник в мире криптографии Java.
- Правильное использование SecureRandom — подробно рассмотрено устройство
SecureRandom
. - SecureRandom с NativePRNG против SHA1PRNG – Stack Overflow — многогранность использования
SecureRandom
в сообществе. - Документация стандартных алгоритмических имен — перечень популярных алгоритмов безопасности в Java.
- Apache Commons Crypto Random — генераторы криптографических случайных чисел, альтернатива
SecureRandom
в Java. - Понимание SecureRandom в Java — детальный анализ работы
SecureRandom
.