Ускорение SecureRandom в Java: обход блокировки /dev/random

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для увеличения скорости работы SecureRandom примените более быстрый неблокирующий источник /dev/urandom, создавая экземпляр при помощи new SecureRandom(). Для улучшения производительности SecureRandom инициализируйте его асинхронно, устанавливая семя.

Java
Скопировать код
SecureRandom srFast = new SecureRandom(); // Для повышения скорости выполнения.

Утверждение на уровне JVM также может ускорить процесс:

shell
Скопировать код
-Djava.security.egd=file:/dev/./urandom  // Увеличиваем скорость генерации

Погружение в устройство urandom

Использование /dev/urandom обеспечивает скорость, но важно знать, как это работает, чтобы обеспечить безопасность ваших конфиденциальных данных. Создание экземпляра SecureRandom без использование аргументов автоматически подключает этот подход. Если вы требуете более высокой степени энтропии, например, для выполнения криптографических операций, рекомендуется явно определить источник семени для SecureRandom.

Java
Скопировать код
byte[] seed = someSecureSource.getBytes();
srFast.setSeed(seed);  // Увеличение уровня энтропии!

Отказ от зависимости от блокировки

Минимизировать зависимость от блокировок, регулярно обновляя энтропию, чтобы не замедлять работу вашей программы. Постоянно применяйте метод setSeed() для обновления семени SecureRandom в фоновом режиме.

Визуализация

Вообразите SecureRandom как трудящегося работника, который медленно наполняет ведро (случайностью).

Markdown
Скопировать код
[🔒💧] -> [🪣🕒]   # SecureRandom медленно наполняет ведро случайностью

Устройтесь удобнее с чашкой кофе и позвольте кешированию или неблокирующему сеиванию переключиться на эту работу.

Markdown
Скопировать код
| Метод                        | Результат                |
| ---------------------------- | ------------------------ |    
| Кеширование ведра (🪣)       | 🚀 Выполнение задачи      |
| Не фазирующее пресеивание (🔄)| ⏩ Бесперебойная работа   |

В результате, ваше приложение обретает непрерывный поток случайности:

Markdown
Скопировать код
[🔒💧] -> [🪣🚀] [🪣⏩]  # Непрерывное получение случайности без ожидания.

Выберите стратегию генерации случайных чисел с учетом потребностей вашего приложения!

Основная проблема

Рассмотрим вопросы производительности, связанные с SecureRandom:

  • Сравнение /dev/random и /dev/urandom: Использование /dev/random, может затянуться во времени, в отличие от /dev/urandom, который всегда готов к работе.
  • Выбор алгоритма: SecureRandom.getInstance('SHA1PRNG') предлагает сочетание скорости и надёжности.
  • Нетривиальные ошибки с серьёзными последствиями: Известный неполадка Java Bug 6202721 влияет на производительность SecureRandom.
Java
Скопировать код
SecureRandom srFastButSafe = SecureRandom.getInstance("SHA1PRNG");  // Быстро и безопасно.

Альтернативные решения

Есть альтернативные подходы:

  • Для некриптографических операций можно использовать надежные семена для повышения скорости.
  • Временами использование Uncommon Maths может попираться на самолюбии и зависить от внешних факторов. Но SecureRandom работает в собственном ритме.

Поиск баланса

При поискам баланса между производительностью и безопасностью, выбор источники энтропии становится основополагающим:

  • Сравнение /dev/random с /dev/urandom: Random более безопасен, но может замедлить работу, в тоже время urandom менее надежен, но работает быстрее.
  • Стратегии семян: Поддержание высокого уровня энтропии обеспечивается регулярным обновлением семян.

Полезные материалы

  1. Руководство по архитектуре криптографии в Java (JCA) — Ваш помощник в мире криптографии Java.
  2. Правильное использование SecureRandom — подробно рассмотрено устройство SecureRandom.
  3. SecureRandom с NativePRNG против SHA1PRNG – Stack Overflow — многогранность использования SecureRandom в сообществе.
  4. Документация стандартных алгоритмических имен — перечень популярных алгоритмов безопасности в Java.
  5. Apache Commons Crypto Random — генераторы криптографических случайных чисел, альтернатива SecureRandom в Java.
  6. Понимание SecureRandom в Java — детальный анализ работы SecureRandom.