Для чого призначений варіант java.security.egd?


22

У проекті, над яким я працюю, програма запускається за допомогою команди, аналогічної цій:

java -Djava.security.egd=file:/dev/urandom -jar app.jar

Я ніколи раніше не бачив такого java.security.egdваріанту. Шукаючи трохи, здається, він використовується для налаштування генерації випадкових чисел у додатку Java.

Це право? Коли передбачається застосувати?

Відповіді:


29

Програми Java можуть і повинні використовувати клас java.security.SecureRandom для створення криптографічно сильних випадкових значень за допомогою криптографічно сильного генератора псевдовипадкових чисел ( CSPRNG ). Стандартні реалізації JDK класу java.util.Random не вважаються криптографічно сильними.

У операційних систем /dev/random, схожих на Unix , є спеціальний файл, який подає псевдовипадкові числа, що отримують доступ до екологічного шуму, зібраного з драйверів пристроїв та інших джерел. Однак він блокує, якщо доступна менша ентропія, ніж вимагається ; /dev/urandomзазвичай ніколи не блокується, навіть якщо насіння генератора псевдовипадкових чисел не було повністю ініціалізовано ентропією з моменту завантаження. Є ще 3-й спеціальний файл, /dev/arandomякий блокується після завантаження, поки насіння не буде надійно ініціалізовано з достатньою ентропією, а потім ніколи не блокується знову.

За замовчуванням JVM виводить клас SecureRandom за допомогою /dev/random, тому ваш код Java може блокуватись несподівано . Параметр -Djava.security.egd=file:/dev/./urandomвиклику командного рядка, який використовується для запуску процесу Java, вказує /dev/urandomзамість цього JVM .

/./Здається, що додаткове змушує JVM використовувати алгоритм SHA1PRNG, який використовує SHA-1 в якості основи PRNG (Псевдогенератор випадкових чисел). Він сильніший за алгоритм NativePRNG, який використовується, коли /dev/urandomвказано.

Нарешті, існує міф про /dev/urandomгенератор псевдовипадкових чисел, PRNG, в той час /dev/randomяк "справжній" генератор випадкових чисел . Це просто не відповідає дійсності, /dev/randomі /dev/urandomвони подаються тим самим CSPRNG (криптографічно захищений генератор псевдовипадкових чисел). За деякою оцінкою, поведінка, коли у відповідного пулу закінчується ентропія, відрізняється: /dev/randomблокує, а /dev/urandomне робить.

А що з ентропією мало? Це не має значення.

Виявляється, що "вигляд випадковим" є основною вимогою для багатьох наших криптографічних будівельних блоків. І якщо ви берете висновок криптографічного хеша, він повинен відрізнятися від випадкової рядки, щоб шифри прийняли його. Це причина використання алгоритму SHA1PRNG, оскільки він використовує хеш-функцію та лічильник разом із початком.

Коли передбачається застосувати?

Завжди, я б сказав.

Джерела:
https://gist.github.com/svrc/5a8accc57219b9548fe1
https://www.2uo.de/myths-about-urandom


EDIT 04/2020:

У коментарі згадується зміна поведінки класу SecureRandom в Java 8.

SHA1PRNG та NativePRNG були зафіксовані для належного дотримання властивостей джерела насіння SecureRandom у файлі java.security. (Незрозуміле рішення за допомогою файлу: /// dev / urandom та file: / dev /./ urandom більше не потрібно.)

На це вже вказували тести, про які йдеться у розділі Джерела вище. Додаткова інформація /./потрібна для зміни алгоритму, який використовується SecureRanom в Java 8 з NativePRNG на SHA1PRNG.

Однак у мене є деякі новини, якими я хотів би поділитися. Відповідно до JEP-273 , оскільки Java 9 клас SecureRandom реалізує три механізми детермінованого генератора випадкових бітів (DRBG), описані в NIST 800-90Ar1 . Ці механізми реалізують сучасні алгоритми настільки ж сильні, як SHA-512 та AES-256.

JDK мав два види реалізації SecureRandom :

  • Одна з них залежить від платформи та базується на вроджених дзвінках або ОС, таких як читання /dev/{u}randomв Unix або використання CryptoAPI в Windows. Останні випуски Linux та Windows вже підтримують DRBG, але старіші випуски та вбудовані системи можуть не робити .
  • Інший вид - це чиста реалізація Java, яка використовує більш стару реалізацію RNG на основі SHA1, яка не настільки сильна, як алгоритми, що використовуються затвердженими механізмами DRBG.

Тим часом посібник для розробників безпеки Java 13 все ще читається

У Linux та macOS, якщо для пристрою збирання ентропії в java.security встановлено file:/dev/urandomабо file:/dev/random, тоді NativePRNG віддається перевагу SHA1PRNG. В іншому випадку кращим є SHA1PRNG.

Щоб уточнити, як нові механізми DRBG грають разом з попередніми PRNG, я запускаю кілька тестів на macOS (Darwin) з AdoptOpenJDK (build 13.0.2 + 8). Ось результати:

file: / dev / random
Порядок уподобань для провайдерів:

SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG

file: / dev / urandom
Порядок уподобань для провайдерів:

SecureRandom.NativePRNG
SecureRandom.DRBG
SecureRandom.SHA1PRNG

file: / dev /./ urandom
Порядок уподобань для провайдерів:

SecureRandom.DRBG
SecureRandom.SHA1PRNG
SecureRandom.NativePRNG

Висновок:

Я рекомендую використовувати -Djava.security.egd=file:/dev/./urandomдля використання найсильнішої реалізації SecureRandom, незалежно від використовуваної платформи, уникаючи несподіваного заблокування коду.


1
Що стосується Java 8, "незрозуміле вирішення" додаткового ./ у назві файлу більше не потрібно, тому ви можете просто використовувати "/ dev / urandom", див.: Docs.oracle.com/javase/8/docs / техноти / путівники / безпека /…
Камаль

Дякуємо за оновлення відповіді (особливо про зміни в Java 9 і 13). Наскільки я розумію, що для Java 8 встановлення "пристрою збирання ентропії" на / dev / urandom або /dev/./urandom має дати точно такі ж результати, інакше виправлення не матиме сенсу. З точки зору ОС, вони вказують на той самий ідентичний файл, так що він не повинен впливати на Java (це робилося до виправлення, але це була помилка, а не призначена функція). Тому ваша заява "Додаткова /./ необхідна для впливу на вибір PRNG". більше не має бути правдою, як для Java 8.
Камал

Дякуємо @Kamal за ваші коментарі. Моя попередня фраза "PRNG selection" була недостатньо чіткою. Я перефразував це, щоб уточнити, я говорю про використовуваний алгоритм: NativePRNG або SHA1PRNG. Використання /dev/urandomвибору NativePRNG, що подається під /dev/urandomчас /dev/./urandomвибору SHA1PRNG (також подається /dev/urandom) при використанні Java 8. Від Java 9 далі DRBG має перевагу, коли /dev/./urandomвказано джерело.
dbaltor

1

Це більше не потрібно, якщо ви використовуєте JDK 8 або вище

Проблема виправлена ​​Java, і ось декілька посилань

Структура

SHA1PRNG та NativePRNG були зафіксовані для належного дотримання властивостей джерела насіння SecureRandom у файлі java.security. (Незрозуміле рішення за допомогою файлу: /// dev / urandom та file: / dev /./ urandom більше не потрібно.)

Для отримання додаткової інформації (пошук випадкових на сторінці):

https://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html

https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html


Я не вірю, що це правильно. Для довідки : tersesystems.com/blog/2015/12/17/… Виправлення в Java 8 говорить лише про те, що вони тепер поважають властивості джерела насіння SecureRandom у файлі java.security. Але за замовчуванням все ще міститься: securerandom.source = file: / dev / random "Незрозумілий спосіб вирішення" посилається на додатковий ./ у назві файлу, який також згадується прийнятим (і найбільш проголосованим) відповіддю тут.
Камаль

«Неясним обхідний шлях» був необхідний тільки в особливих випадках, см: bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721
Kamal

@Kamal Посилання, які ви опублікували, стосуються Java 6 та новіших версій,
Venu Madhav

Це саме те, що було зафіксовано в Java 8. Відповідно до звіту про помилку, «незрозумілий спосіб вирішення проблеми» (додавання додаткового ./ у назві файлу) був потрібний після Java 1.4.2 та до 6. Я припускаю також у Java 7, інакше це не буде зазначено як фіксоване в Java 8. Налаштування / dev / urandom замість / dev / random все ж потрібно, якщо ви хочете використовувати неблокуючий пристрій.
Камаль

0

Це пов’язано з різницею генератора Linux /dev/randomта /dev/urandomвипадкових чисел.

Взяте за цим посиланням

Java Bug 6202721 зазначає, що java.security.SecureRandom використовує / dev / random, а не / dev / urandom, навіть якщо вказано / dev / urandom, оскільки в той час (близько 2004 року) / dev / urandom не працював належним чином. Помилка ніколи не поверталася, коли / dev / urandom працює досить добре. Тому вам доведеться підробити це, заховавши налаштування за допомогою /dev/./urandom, щоб змусити використовувати SHA1PRNG, а не / dev / random.

Щоб відповісти на ваше запитання

Коли передбачається застосувати?

Виходячи з вищенаведеного посилання, це щось унікальне для версій Java 5 та наступного, що виникло внаслідок проблем з / dev / urandom в системах Linux ще в 2004 році.


Мабуть, в цій статті є помилка друку, оскільки Java Bug 6202721 насправді заявляє: "Це проблема, якщо / dev / urandom обраний, оскільки / dev / random не працює належним чином." Тому ваш висновок "внаслідок проблем з / dev / urandom" невірний. Див. Прийняту відповідь для пояснення щодо вибору / dev / urandom замість типового (/ dev / random). У більшості випадків це гарна ідея.
Камаль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.