Осуществляет ли реализация 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 окажется достаточно случайным для ваших целей.