SecureRandom.ints () является безопасным?

Известно, что класс SecureRandom обеспечивает надежную криптографическую безопасность для сгенерированного случайного числа. java.util.Random небезопасно для ситуации, которая требует криптографической защиты. Типичное использование SecureRandom:

SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);

Однако я встречал случай:

SecureRandom random = new SecureRandom();
int number = random.ints();

Метод ints() унаследован от класса java.util.Random. Я сбит с толку, когда SecureRandom, который является безопасным генератором случайных чисел, использует метод, унаследованный от небезопасного генератора случайных чисел, является ли он безопасным?

53
задан Lutz Horn 30 July 2019 в 08:02
поделиться

3 ответа

Да это безопасно.

исследование Кода java.util.Random шоу, который ints() создает spliterator, который использует internalNextInt(...) для генерации случайных целых чисел. Это в свою очередь звонит nextInt() на this. В случае java.security.SecureRandom, nextInt() переопределяется для генерации "безопасного" случайного числа <глоток> 1 .

можно подтвердить это для себя путем рассмотрения исходного кода.

<час>

<глоток> 1 - Конечно, на самом деле не имеет смысла называть целое число или последовательность целых чисел "безопасными". И существуют ситуации, где SecureRandom не может иметь свойств, которых Вы требуете. (Это зависит от фактического RNG или реализации PRNG, используемой классом, качеством предоставленного семени или системы, обеспеченной энтропийный источник, и так далее.), Но SecureRandom:: ints () генерирует последовательность целых чисел, которая имеет те же свойства, как будто Вы сделали последовательность SecureRandom:: nextInt () обращается к тому же объекту. Если последняя последовательность подходит в Ваших целях (независимо от того, что они), затем так первый.

33
ответ дан 7 November 2019 в 08:08
поделиться

Да, SecureRandom

обеспечивает криптографически сильный генератор случайных чисел (RNG).

Одним важным фактором для безопасного RNG является семя.

Поэтому любой материал семени, переданный объекту SecureRandom, должен быть непредсказуемым, и все выходные последовательности SecureRandom должны быть криптографически сильными, как описано в RFC 4086: Требования Случайности для безопасности.

Разрешение и использование это. Если Вы интересуетесь деталями, считайте JavaDoc, который описывает различные подходы, используемые реализациями.

10
ответ дан 7 November 2019 в 08:08
поделиться

Random.ints() метод, который возвращается IntStream. IntStream не безопасно и не небезопасен: это - поток чисел.

"безопасность" последовательности ints, возвращенного методом, зависит от реализации метода. SecureRandom генерирует его "случайные" значения более надежно, чем Random. Они совместно используют тот же API, и таким образом можно использовать любого в данном контексте в зависимости от требований.

Так, факт, который это наследовало от небезопасного класса, не важен безопасности: Вы можете довольно доверительный, что SecureRandom класс так безопасен, как в документации говорится, что это.

<час>

Рассматривают аналогию с HashSet: это не делает гарантий итератора, заказывая ; однако, LinkedHashSet , подкласс HashSet делает упорядочивание итератора гарантии. Гарантия LinkedHashSet согласовывается с гарантией [1 110], потому что определенное упорядочивание является одним из возможных упорядочиваний, которые не могли наблюдаться с "никаким гарантируемым упорядочиванием" (в конце концов, необходимо возвратить элементы в [1 119] приблизительно [1 119] порядок).

Точно так же Random не делает гарантии о безопасности последовательности ints возвращенными; SecureRandom делает более сильные гарантии. Но нет никакой причины, почему последовательность ints от SecureRandom не могла также быть возвращена Random по совпадению.

14
ответ дан 7 November 2019 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: