Насколько хорошо SecRandomCopyBytes? - PullRequest
22 голосов
/ 29 апреля 2011

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 07 мая 2011

/ 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;
    }
}
4 голосов
/ 03 мая 2011
  1. Согласно документации для iOS , SecRandomCopyBytes - это просто оболочка для /dev/random PRNG.В большинстве реализаций Unix этот файл является блокирующим PRNG;однако, согласно этой странице и документация , /dev/random на OSX / iOS фактически работает как /dev/urandom в большинстве других реализаций Unix в том смысле, что она никогда не блокируется.

  2. Поскольку он не блокируется, вы сможете быстро определить скорость, с которой он генерирует случайные числа, с помощью простого теста.

  3. /dev/random isдолжен попытаться получить энтропию из как можно большего количества источников.Таким образом, вполне разумно полагать, что в iOS он использует радио и акселерометр в качестве источников энтропии;однако я не могу найти никаких источников для этого, а в документации говорится только о том, что это "случайные измерения дрожания ядра" .

  4. Похоже, что в настоящее время iPhone находится в процессе проверки FIPS 140-2.

1 голос
/ 03 мая 2011

iOS SDK четко заявляет, что эта функция использует вывод /dev/random для извлечения безопасных случайных данных.Поскольку iOS является портированной версией OSX, которая сама по себе является Free-BSD.

Если вы ищете для /dev/random и OSX, вы обнаружите несколько сообщений о том, что возникла (и может быть) проблема, связанная сколлекция энтропии в OSX:

http://www.mail-archive.com/cryptography@metzdowd.com/msg00620.html

Поэтому я ожидаю, что /dev/random работаетне лучше, чем в OSX.

...