25

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

有没有人有以下信息:

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

文档没有涵盖这些要点。

我只能找到传闻说它使用来自收音机、指南针、加速度计和其他来源的信息,但没有来自实际代表 Apple 的人的引用。

4

3 回答 3

20

/dev/random 由 SecurityServer 的熵提供。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;
    }
}
于 2011-05-06T23:53:57.383 回答
6
  1. 根据iOS 文档SecRandomCopyBytes它只是/dev/randomPRNG 的一个包装器。在大多数 Unix 实现中,这个文件是一个阻塞 PRNG;但是,根据此页面文档/dev/random在 OSX/iOS 上实际上功能与/dev/urandom大多数其他 Unix 实现一样,因为它不会阻塞。

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

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

  4. iPhone 目前似乎正在通过 FIPS 140-2 验证。

于 2011-05-03T19:31:53.990 回答
2

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

如果您搜索/dev/randomOSX,您会发现几篇关于 OSX 中的熵收集存在(而且我是)问题的帖子:

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

因此,我希望它/dev/random不会比 OSX 中的效果好。

于 2011-05-03T15:33:06.213 回答