Подтвердить что ты не робот

Насколько хороши SecRandomCopyBytes?

В основном меня интересует реализация SecRandomCopyBytes в iOS, если она отличается от реализации OS X. (Я бы предположил, что это происходит, поскольку мобильное устройство имеет все более доступные источники энтропии, чем настольный компьютер.)

Есть ли у кого информация:

  • Где SecRandomCopyBytes получает энтропию от?
  • Какая скорость может генерировать хорошие случайные числа?
  • Будет ли он блокироваться или сбой немедленно, если не хватает энтропии?
  • Соответствует ли это FIPS 140-2, или он был включен в любую другую официальную сертификацию?

Документация не охватывает эти моменты.

Мне удалось найти только услышанные комментарии о том, что он использует информацию из радиостанций, компаса, акселерометров и других источников, но никаких цитат от людей, фактически представляющих Apple.

4b9b3361

Ответ 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.