Осуществляет ли реализация SecureRandom Android истинное случайное число?

Я читал, что, как правило, некоторые реализации SecureRandom могут создавать истинные случайные числа.

В частности, Android docs говорят

экземпляры этого класса будут генерировать начальное семя, используя внутренний источник энтропии, такой как /dev/urandom

но означает ли это, что он произведет истинные случайные числа (т.е. вместо псевдослучайных чисел)?

И если я использую SecureRandom в Android таким образом...

SecureRandom sr = new SecureRandom();

... я получу действительно случайный вывод, когда я назову sr.nextBoolean()?

Или результат может быть больше (или меньше?) случайным, если я вместо этого получаю вывод, делая это каждый раз: new SecureRandom().nextBoolean()?

Ответ 1

"Истинные" и "псевдослучайные" случайные числа означают для разных людей много разных вещей. Лучше всего этого избежать.

/dev/urandom получил плохую репутацию, потому что люди не понимают различий между ним и /dev/random (намного меньше разница, чем вы ожидали).

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

Если у вас есть время, вы можете прочитать мое эссе по всей проблеме.

Ответ 2

Ключевым ответом является то, что /dev/urandom, поскольку определяемый ядром linux, гарантированно не блокируется. Акцент делается на том, чтобы не останавливать пользователя при достаточной энтропии. Если андроидные документы говорят, что они используют /dev/urandom для инициализации, И в ядре недостаточно энтропии для предоставления случайных чисел, ядро ​​вернется к псевдослучайному алгоритму.

В документации ядра, /dev/urandom считается достаточным для почти всех целей, кроме "долгоживущих [шифрования] ключей". Учитывая описание вашего предполагаемого использования, я подозреваю, что Android SecureRandom окажется достаточно случайным для ваших целей.