许多用户空间CSPRNG都有一个问题,在fork(2)
之后,两个不同的进程可能会返回相同的随机字节流。
从dtruss
开始,很明显SecRandomCopyBytes
至少是从/dev/random
播种,但它是以{{1}之后安全使用的方式进行的}}?
使用以下源代码:
fork()
我从#include <Security/Security.h>
int main() {
uint8_t data[8];
SecRandomCopyBytes(kSecRandomDefault, 8, data);
SecRandomCopyBytes(kSecRandomDefault, 8, data);
printf("%llu\n", *(uint64_t *)data);
}
获得以下内容(删除了无关的内容):
dtruss
答案 0 :(得分:7)
实现实际上是CCRandomCopyBytes():
http://www.opensource.apple.com/source/Security/Security-55471/libsecurity_keychain/lib/SecRandom.c
int SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes) {
if (rnd != kSecRandomDefault)
return errSecParam;
return CCRandomCopyBytes(kCCRandomDefault, bytes, count);
}
所以实际代码在这里:
http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-60049/lib/CommonRandom.c
CCRandomCopyBytes包含中的注释表明它是fork()安全:
调用系统随机数生成器很不方便 直。在调用/ dev / random的简单情况下,调用者 必须打开设备并关闭它,除了管理它 虽然它是开放的。该模块具有直接的存在理由 这样做的不便之处。它管理文件描述符 / dev / random包括发生的异常处理 在fork()和exec()中。调用CCRandomCopyBytes()和所有 为您管理繁琐的位。只要继续你的一切 真的很想做。 [...]
在我自己的快速测试中,孩子在调用SecRandomCopyBytes()时会被杀死