Насколько хороши SecRandomCopyBytes?
В основном меня интересует реализация SecRandomCopyBytes
в iOS, если она отличается от реализации OS X. (Я бы предположил, что это происходит, поскольку мобильное устройство имеет все более доступные источники энтропии, чем настольный компьютер.)
Есть ли у кого информация:
- Где SecRandomCopyBytes получает энтропию от?
- Какая скорость может генерировать хорошие случайные числа?
- Будет ли он блокироваться или сбой немедленно, если не хватает энтропии?
- Соответствует ли это FIPS 140-2, или он был включен в любую другую официальную сертификацию?
Документация не охватывает эти моменты.
Мне удалось найти только услышанные комментарии о том, что он использует информацию из радиостанций, компаса, акселерометров и других источников, но никаких цитат от людей, фактически представляющих Apple.
Ответы
Ответ 1
/dev/random подается энтропией из SecurityServer. SecurityServer собирает энтропию из отслеживания событий ядра (kdebug). Метод описан в книге "Внутренние системы Mac OS X. Системный подход". Вы можете прочитать об этом онлайн, например, http://flylib.com/books/en/3.126.1.73/1/
исходный код для сбора энтропии находится здесь: http://www.opensource.apple.com/source/securityd/securityd-40600/src/entropy.cpp
В xnu-1504.9.37 (последняя версия для OS X с момента написания) буфер энтропии ядра заполняется в kernel_debug_internal()
, используя только информацию о времени. Это единственное место, где записывается энтропийный буфер.
if (entropy_flag && (kdebug_enable & KDEBUG_ENABLE_ENTROPY)) {
if (kd_entropy_indx < kd_entropy_count) {
kd_entropy_buffer [ kd_entropy_indx] = mach_absolute_time();
kd_entropy_indx++;
}
if (kd_entropy_indx == kd_entropy_count) {
/*
* Disable entropy collection
*/
kdebug_enable &= ~KDEBUG_ENABLE_ENTROPY;
kdebug_slowcheck &= ~SLOW_ENTROPY;
}
}
Ответ 2
-
Согласно документации iOS, SecRandomCopyBytes
является всего лишь оберткой для /dev/random
PRNG. В большинстве реализаций Unix этот файл является блокирующим PRNG; однако, согласно этой странице и документации, /dev/random
в OSX/iOS фактически функционирует как /dev/urandom
в большинстве других реализаций Unix, поскольку он никогда не блокирует.
-
Поскольку он не блокируется, вы должны быстро определить скорость, с которой он генерирует случайные числа, используя простой тест.
-
/dev/random
должен попытаться получить энтропию из как можно большего количества источников. Таким образом, вполне разумно полагать, что на iOS он использует радио и акселерометр в качестве источников энтропии; однако я не могу найти никаких источников для этого, и documentation утверждает только, что он исходит из "случайных измерений дрожания ядра".
-
Похоже, что iPhone в настоящий момент в процессе подтверждения FIPS 140-2.
Ответ 3
В iOS SDK четко указано, что эта функция использует вывод /dev/random
для извлечения защищенных случайных данных. Поскольку iOS является портированной версией OSX, которая сама по себе является базовой версией Free-BSD.
Если вы ищете для /dev/random
и OSX, вы найдете несколько сообщений, в которых была (и моя) проблема с энтропийной коллекцией в OSX:
http://www.mail-archive.com/[email protected]/msg00620.html
Поэтому я ожидал бы, что /dev/random
работает не лучше, чем в OSX.