Random vs SecureRandom

197
15 марта 2018, 09:32

Почему иногда Random работает корректно, то есть выдает разные значения при каждом запуске, как то раз запускал psvm подряд много раз он выдавал одно и тоже значение, в другой раз запускаю так же в psvm он работал нормально. Бывает так же еще что Random вызывал в рантайме около ста раз и выдавал одно и тоже значение. 1. Понимаю что это псевдогенерация, но почему иногда оправдывает свое название и иногда не подводит? Что значит псевдогенерация? Чем secureRandom лучше.

Answer 1

Обычный Random генерирует псевдослучайную последовательность заранее детерменированную.

То есть если задать определённый seed то Random(seed), будет выдавать одинаковые последовательности.

При использовании new Random() он создаёт seed на основе текущего времени, если подряд создать несколько new Random() то с большой вероятностью seed окажется одинаковым и последовательности будут повторяться. Тут тоже можно почитать - ГСЧ генерирует одинаковые последовательности , ответ для C# но для Java он тоже работает.

С помощью такой последовательности нельзя генерировать например пароли или сертификаты безопасности. Зная первые числа и алгоритм функции Random можно пробовать восстановить всю последовательность.

Как раз для таких ситуаций и придуман криптографический SecureRandom. Он даёт следующие числа не просто в зависимости от предыдущих, а использует сложно предсказуемые величины для генерации числа, например информацию о температуре процессора, вольтаж, и другие параметры которые нельзя предсказать.

Так же SecureRandom работает существенно медленнее обычного Random.

Answer 2

Random - генератор псевдослучайных чисел. Вырезка из документации: https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

An instance of this class is used to generate a stream of pseudorandom numbers. The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.) If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.

Это значит, что он гарантирует определённое распределение сгенерированных чисел, позволяет генерировать их быстро, но на самом деле случайными эти числа не являются. Сгенерированная последовательность зависит от инициализирующего значения (seed), если использовать один и тот же seed, то и последовательность будет одинаковая. SecureRandom гарантирует, что последовательность будет криптостойкой, но это может снизить скорость генерации. Подробнее о псевдослучайных генераторах можно почитать в методическом пособии, глава 6.

READ ALSO
Как спарсить JSON в массив java обьектов Retrofit

Как спарсить JSON в массив java обьектов Retrofit

Есть сайт ссылка для этого сайта как model создать ?

204
Observable.concat

Observable.concat

Имеется 2 источника данных: БД и серверПри старте приложения вызывается следующий метод репозитория (MyRepository):

203
Как выделенный текст обернуть в тэг?

Как выделенный текст обернуть в тэг?

Есть простой текст в div-блокеКак при выделении фрагмента этого текста обернуть его в тэг ? Или как сделать то же самое, но при клике на кнопку,...

213
IE игнорирует oncontextmenu

IE игнорирует oncontextmenu

Всем привет! Решил запретить контекстное меню браузеров на сайте использовал

200