SecRandomCopyBytes有多好?

25

我主要关注在iOSSecRandomCopyBytes的实现,如果它与OS X的实现有所不同(因为移动设备比桌面计算机拥有更多和更容易获取的熵源)。

有人了解以下信息吗:

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

文档未涵盖这些要点。

我只能找到一些 hearsay 评论,说它使用来自无线电、罗盘、加速计和其他来源的信息,但没有引述实际代表苹果公司的人的话。

3个回答

20

/dev/random通过从SecurityServer获取的熵进行输入。SecurityServer从内核事件跟踪(kdebug)中收集熵。该方法在书籍"Mac OS X Internals. A Systems Approach"中有描述。您可以在此处在线阅读相关内容。

熵收集的源代码位于此处

在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;
    }
}

谢谢!我正在努力寻找在iOS上实际收集熵的内核syscall实现:我有最新的OS X的xnu内核版本(1504.9.37),但找不到iOS使用的版本(如果它甚至是开源的? - 但假定它必须是)。 - James
我编辑了你的答案,加入了我从XNU-1504.9.37中发现的内容 :) - James

6

根据iOS文档SecRandomCopyBytes只是/dev/random PRNG的包装器。在大多数Unix实现中,此文件是阻塞PRNG;然而,根据这个页面文档,在OSX/iOS上,/dev/random实际上像大多数其他Unix实现中的/dev/urandom一样工作,不会阻塞。
由于它不会阻塞,因此您应该能够使用简单的测试快速确定它生成随机数的速率。 /dev/random应该尽可能从许多来源获取熵。因此,可以完全合理地认为在iOS上,它使用无线电和加速度计作为熵源;但是,我找不到任何来源来证明这一点,文档仅说明它来自内核的随机抖动测量。
似乎iPhone目前正在进行FIPS 140-2验证

2
iOS SDK清楚地说明,该函数使用/dev/random的输出来检索安全随机数据。由于iOS是OSX的移植版本,而OSX本身在其核心上是一个Free-BSD。
如果您搜索/dev/random和OSX,您会发现有几篇帖子称在OSX中存在(并且可能仍然存在)关于熵收集的问题:

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

因此,我预计 /dev/random 的工作效果不会比OSX中的更好。

1
阅读关于 OS X 上的 /dev/random 确实很有趣,但也增加了一些怀疑! - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接