Рубрики
Без рубрики

Вариант JVM java.security.egd

Автор оригинала: Roger Yates.

1.Обзор

При запуске Виртуальной машины Java (JVM) мы можем определить различные свойства, которые изменят поведение нашего СПМ. Одним из таких свойств является java.security.egd.

В этом учебнике мы рассмотрим, что это такое, как его использовать и какой эффект он имеет.

2. Что такое java.security.egd?

Как свойство JVM, мы можем использовать java.security.egd влиять на то, как БезопасныйРандом класс инициализируется.

Как и все свойства JVM, мы объявляем его с помощью -D параметр в нашей командной строке при запуске JVM:

java -Djava.security.egd=file:/dev/urandom -cp . com.baeldung.java.security.JavaSecurityEgdTester

Как правило, если мы запускаем Java 8 или позже и работаем на Linux, то наш JVM будет использовать файл:/dev/urandom по умолчанию.

3. Какой эффект имеет java.security.egd?

Когда мы делаем наш первый звонок, чтобы прочитать байты БезопасныйРандом мы заставить его инициализировать и читать СПМ в java.security конфигурация файла . Этот файл содержит securerandom.источник имущественные :

securerandom.source=file:/dev/random

Поставщики услуг безопасности, такие как sun.security.provider.Sun прочитать это свойство при .

Когда мы будем устанавливать наши java.security.egd Свойство JVM поставщик безопасности может использовать его для переопределения настроенного в securerandom.источник .

Вместе, java.security.egd и securerandom.источник контроль, который устройство для сбора энтропии (EGD) будет использоваться в качестве основного источника данных семян, когда мы используем БезопасныйРандом для генерации случайных чисел.

До Java 8 мы находим java.security в $JAVA-HOME/jre/lib/security , но в более поздних реализациях, это в $JAVA-HOME/conf/security .

Независимо от того, egd вариант имеет какой-либо эффект зависит от реализации поставщика безопасности.

4. Какие значения может Java.security.egd принять?

Мы можем указать java.security.egd в формате URL с такими значениями, как:

  • файл:/dev/random
  • файл:/dev/urandom
  • файл:/dev/./urandom

Имеет ли эта настройка какой-либо эффект или какое-либо другое значение, зависит от платформы и версии Java, которую мы используем, и от того, как была настроена безопасность нашего СПМ.

На операционных системах на базе Unix (OS) /dev/случайный это специальный путь файла, который появляется в файловой системе как обычный файл, но читает от него на самом деле взаимодействуют с драйвером устройства ОС для генерации случайных чи номеров. Некоторые реализации устройств также обеспечивают доступ через /dev/урандом и даже /dev/arandom УРИС.

5. Что такое так особенное о файле:/dev/./urandom?

Во-первых, давайте поймем разницу между файлами /dev/случайный и /dev/урандом:

  • /dev/случайный собирает энтропию из различных источников; /dev/случайный будет блокировать, пока он не имеет достаточно энтропии, чтобы удовлетворить наш запрос читать с непредсказуемыми данными
  • /dev/урандом будет получать псевдо-случайность от того, что доступно, без блокирования.

Когда мы впервые используем БезопасныйРандом , наш по умолчанию ВС Семеннойгенератор Инициализирует.

Когда мы используем любой из специальных значений файл:/dev/random или файл:/dev/urandom , мы причиняем Солнце Семеннойгенератор использовать родную (платформу) реализацию.

Реализации поставщика на Unix могут блокироваться, по-прежнему читая /dev/случайный . В Java 1.4 были обнаружены некоторые реализации этой проблемы. Ошибка была впоследствии исправлена под руководством Java 8 Предложение о повышении JDK (JEP 123) .

Использование URL-адреса, например файл:/dev/./urandom , или любое другое значение, вызывает Семеннойгенератор рассматривать его как URL-адрес источника семян, который мы хотим использовать .

На unix-как системы, наши файл:/dev/./urandom URL-адрес решает тот же не-блокирующий /dev/урандом файл.

Тем не менее, мы не всегда хотим использовать это значение. В Windows у нас нет этого файла, поэтому наш URL не решается. Это запускает окончательный механизм для генерации случайности и может задержать нашу инициализацию примерно на 5 секунд.

6. Эволюция безопасногорандома

Эффект java.security.egd изменился с помощью различных java-релизов.

Итак, давайте посмотрим некоторые из наиболее значимых событий, которые повлияли на поведение БезопасныйРандом :

Понимание того, как БезопасныйРандом изменилось дает нам представление о вероятном влиянии java.security.egd свойство.

7. Тестирование влияния java.security.egd

Лучший способ быть уверенным в эффекте свойства JVM, чтобы попробовать его. Итак, давайте посмотрим на эффект java.security.egd путем работать некоторые кодовые создать новую БезопасныйРандом и сроки, сколько времени требуется, чтобы некоторые случайные байты.

Во-первых, давайте создадим JavaSecurityEgdТестер класс с основной () метод. Мы приутем наш звонок к secureRandom.nextBytes () с помощью System.nanoTime() и отобразить результаты:

public class JavaSecurityEgdTester {
    public static final double NANOSECS = 1000000000.0;

    public static void main(String[] args) {
        SecureRandom secureRandom = new SecureRandom();
        long start = System.nanoTime();
        byte[] randomBytes = new byte[256];
        secureRandom.nextBytes(randomBytes);
        double duration = (System.nanoTime() - start) / NANOSECS;

        System.out.println("java.security.egd = " + System.getProperty("java.security.egd") + " took " + duration + " seconds and used the " + secureRandom.getAlgorithm() + " algorithm");
    }
}

Теперь, давайте запустить JavaSecurityEgdТестер тест, запустив новый экземпляр Java и указав значение для java.security.egd свойство:

java -Djava.security.egd=file:/dev/random -cp . com.baeldung.java.security.JavaSecurityEgdTester

Давайте проверим выход, чтобы увидеть, сколько времени занял наш тест и какой алгоритм был использован:

java.security.egd=file:/dev/random took 0.692 seconds and used the SHA1PRNG algorithm

Поскольку наше системное свойство читается только при инициализации, давайте запустим наш класс в новом JVM для каждого различного значения java.security.egd :

java -Djava.security.egd=file:/dev/urandom -cp . com.baeldung.java.security.JavaSecurityEgdTester
java -Djava.security.egd=file:/dev/./urandom -cp . com.baeldung.java.security.JavaSecurityEgdTester
java -Djava.security.egd=baeldung -cp . com.baeldung.java.security.JavaSecurityEgdTester

На Windows с помощью Java 8 или Java 11 тесты с значениями файл:/dev/random или файл:/dev/urandom дать к югу от второго раза. Используя все остальное, например, файл:/dev/./urandom , или даже baeldung , делает наши тесты занять более 5 секунд!

Смотрите наш предыдущий раздел для объяснения того, почему это происходит. На Linux мы можем получить разные результаты.

8. А как насчет SecureRandom.getInstanceStrong()?

Java 8 представила SecureRandom.getInstanceStrong () метод. Давайте посмотрим, как это влияет на наши результаты.

Во-первых, давайте заменим наш новый SecureRandom () с БезопасныйРандом. getInstanceStrong () :

SecureRandom secureRandom = SecureRandom.getInstanceStrong();

Теперь давайте забудем тесты еще раз:

java -Djava.security.egd=file:/dev/random -cp . com.baeldung.java.security.JavaSecurityEgdTester

При запуске на Windows значение java.security.egd свойство не имеет заметного эффекта, когда мы используем SecureRandom.getInstanceStrong () . Даже непризнанное значение дает нам быстрый ответ.

Давайте проверим наш выход еще раз и заметим время менее 0,01 секунды. Давайте также отметим, что алгоритм теперь Windows-PRNG:

java.security.egd=baeldung took 0.003 seconds and used the Windows-PRNG algorithm

Обратите внимание, что PRNG в названиях алгоритмов означает псевдо-случайный генератор чисел.

9. Посев алгоритма

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

Итак, как мы семени наших алгоритмов непосредственно влияет на предсказуемость случайных чисел, которые они производят.

Чтобы создать непредсказуемость, БезопасныйРандом реализации используют энтропию, собранную из накопленного ввода, для посева своих алгоритмов. Это происходит от IO устройств, таких как мыши и клавиатуры.

В системах, похожих на Unix, наша энтропия накапливается в файле /dev/случайный .

Там нет /dev/случайный файл на Windows. Установка -Djava.security.egd к любой файл:/dev/random или файл:/dev/urandom приводит к тому, что алгоритм по умолчанию (SHA1PRNG) использование родного API Microsoft Crypto.

10. А как насчет виртуальных машин?

Иногда наше приложение может работать в виртуальной машине, которая практически не собирает энтропию в /dev/случайный .

Виртуальные машины не имеют физической мыши или клавиатуры для генерации данных , так что энтропия в /dev/случайный накапливается гораздо медленнее. Это может привести к нашему дефолту БезопасныйРандом вызов, чтобы заблокировать, пока не будет достаточно энтропии для для создания непредсказуемого числа.

Есть шаги, которые мы можем предпринять, чтобы смягчить это. Например, при запуске VM в RedHat Linux системный администратор может настроить виртуальный генератор случайных чисел IO, виртио-ринг . Это считывает энтропию из физической машины, на которую она размещается.

11. Советы по устранению неполадок

Если наше приложение зависает, когда оно или его зависимости генерируют БезопасныйРандом номера, рассмотреть java.security.egd – в частности, когда мы запускаем на Linux, и если мы работаем на предварительной Java 8.

Наши приложения Spring Boot часто используют встроенные Томкат . При этом используется БезопасныйРандом s для генерации ключей сеанса. Когда мы видим, что операция Tomcat “Создание экземпляра SecureRandom” занимает 5 секунд или более, мы должны попробовать различные значения для java.security.egd .

12. Заключение

В этом учебнике мы узнали, что такое свойство java.security.egd заключается в том, как его использовать и какой эффект он имеет. Мы также обнаружили, что его эффекты могут варьироваться в зависимости от платформы, на которой мы работаем, и версии Java, которую мы используем.

В качестве последней ноты, мы можем прочитать больше о БезопасныйРандом и как это работает в Раздел SecureRandom справочного руководства JCA и Спецификация API SecureRandom и быть в курсе некоторых из мифы об урандоме .

Как обычно, код можно найти более на GitHub .