ios - ¿Qué tan bueno es SecRandomCopyBytes?
security entropy (3)
Principalmente estoy interesado en la implementación de SecRandomCopyBytes
en iOS , si difiere de la implementación de OS X. (Supongo que sí, ya que un dispositivo móvil tiene más y más fácilmente disponibles fuentes de entropía que una computadora de escritorio).
¿Alguien tiene información sobre:
- ¿De dónde obtiene la entropía SecRandomCopyBytes?
- ¿Qué tasa puede generar buenos números aleatorios?
- ¿Bloqueará o fallará inmediatamente si no hay suficiente entropía disponible?
- ¿Cumple con FIPS 140-2, o se ha incluido en alguna otra certificación oficial?
La documentación no cubre estos puntos.
Solo he podido encontrar comentarios de oídas que usan información de radios, la brújula, los acelerómetros y otras fuentes, pero no hay citas de personas que representen a Apple.
De acuerdo con la documentación de iOS ,
SecRandomCopyBytes
es solo un contenedor para el/dev/random
PRNG. En la mayoría de las implementaciones de Unix, este archivo es un PRNG de bloqueo; sin embargo, de acuerdo con esta página y la documentación ,/dev/random
en OSX / iOS en realidad funciona como/dev/urandom
en la mayoría de las otras implementaciones de Unix en que nunca se bloquea.Como no se bloquea, debería poder determinar rápidamente la tasa que genera números aleatorios utilizando una prueba simple.
Se supone que
/dev/random
intenta obtener entropía de tantas fuentes como sea posible. Por lo tanto, es completamente razonable creer que en iOS utiliza la radio y el acelerómetro como fuentes de entropía; sin embargo, no puedo encontrar ninguna fuente para esto, y la documentación solo indica que proviene de "las mediciones aleatorias de jitter del kernel" .Parece que el iPhone está actualmente en proceso de ser FIPS 140-2 validado.
/ dev / random es alimentado por la entropía desde el SecurityServer. SecurityServer recolecta la entropía del seguimiento de eventos del kernel (kdebug). El método se describe en el libro "Mac OS X Internals. A Systems Approach". Puede leerlo en línea, por ejemplo, en http://flylib.com/books/en/3.126.1.73/1/
El código fuente para la recopilación de entropía está aquí: http://www.opensource.apple.com/source/securityd/securityd-40600/src/entropy.cpp
En xnu-1504.9.37 (la última versión para OS X en el momento de la escritura), el búfer de entropía del kernel se rellena con kernel_debug_internal()
, usando solo información de tiempo. Este es el único lugar donde se escribe el búfer de entropía.
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;
}
}
El iOS SDK indica claramente que esta función utiliza la salida de /dev/random
para recuperar los datos aleatorios seguros. Como iOS es una versión portada de OSX que en sí misma es en su núcleo un Free-BSD.
Si busca /dev/random
y OSX, encontrará varias publicaciones que hubo (y mi problema es) un problema relacionado con la colección de entropía en OSX:
http://www.mail-archive.com/[email protected]/msg00620.html
Por lo tanto, espero que /dev/random
no funcione mejor que el de OSX.