SecRandomCopyBytes有多好?

如果它与OS X实现不同,我主要对在iOS上实现SecRandomCopyBytes感兴趣。 (我认为它确实存在,因为移动设备比台式计算机拥有越来越多的现成熵源。)

有没有人有关于的信息:

  1. SecRandomCopyBytes从哪里获得熵?
  2. 什么率它可以产生好的随机数?
  3. 如果没有足够的熵,它会阻塞还是立即失败?
  4. 它符合FIPS 140-2标准,还是已包含在任何其他官方认证中?

文档没有涵盖这些要点。

我只能找到听到的评论,说它使用来自无线电,指南针,加速度计和其他来源的信息,但实际上代表Apple的人没有引用。

/ dev / random由SecurityServer的entropy提供。 SecurityServer从内核事件跟踪(kdebug)收集熵。 该方法在“Mac OS X Internals.A Systems Approach”一书中有所描述。 您可以在线阅读相关信息,例如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; } } 
  1. 根据iOS文档 , SecRandomCopyBytes只是/dev/random PRNG的包装器。 在大多数Unix的实现中,这个文件是一个阻塞的PRNG; 但是,根据这个页面和文档 ,OSX / iOS上的/dev/random在大多数其他Unix实现中的实际function类似于/dev/urandom ,因为它不会阻塞。

  2. 由于它不会阻塞,您应该能够使用简单的测试快速确定它生成随机数的速率。

  3. /dev/random应该尝试从尽可能多的源中获取熵。 因此,完全有理由相信在iOS上它使用无线电和加速度计作为熵的来源; 但是,我找不到任何这方面的资料, 文档只说它来自“内核的随机抖动测量”

  4. 看来iPhone目前正在通过FIPS 140-2validation。

iOS SDK明确指出此函数使用/dev/random的输出来检索安全随机数据。 由于iOS是OSX的移植版本,它本身就是Free-BSD的核心。

如果您搜索/dev/random和OSX,您会发现有几个post(我的存在)是关于OSX中的熵收集的问题:

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

因此我希望/dev/random效果不会好于OSX中的那个。