在 iOS 上使用 C++ 获取加密安全的随机数
Posted
技术标签:
【中文标题】在 iOS 上使用 C++ 获取加密安全的随机数【英文标题】:Getting cryptographically secure random numbers in C++ on iOS 【发布时间】:2015-09-24 17:57:31 【问题描述】:我正在开发一个用 Objective-C 和 C++ 编写的 ios 应用程序。在 C++ 部分,我需要加密安全的随机数。
据我了解 iOS 安全模型,无法直接访问 /dev/random
。对吗?
获取安全随机数的官方方法是SecRandomCopyBytes。可悲的是,这是一个 Objective-C 接口。有没有办法在 C++ 中使用这个接口,最好不要求助于 Objective-C++?
还有arc4random,但我现在不太愿意使用任何基于RC4的东西......
【问题讨论】:
【参考方案1】:在任何基于“C”的语言(包括 Swift)上获取加密安全随机数的一种方法是“C”arc4random 函数。
对于随机数整数 (u_int32_t),请使用 arc4random()
和 arc4random_uniform()
。
对于一系列随机字节,使用 arc4random_buf()
函数用 ARC4 派生的随机数据填充长度为 nbytes 的缓冲区。
RC4是arc4random的一部分,关键是不断播种:
arc4random() 函数可以非常快速地提供高质量的 32 位伪随机数。 arc4random() 定期从 random(4) 中描述的内核强随机数子系统为自己播种。
arc4random source code 可用。请注意,它是通过从/dev/urandom
读取部分由(搅拌)播种的。小心避免众所周知的 RC4 弱点。此外,初始化状态时包含了时间,因此无法两次重新生成相同的随机序列。
注意:虽然文档指出 /dev/random
会因缺乏熵而阻塞,但这在 OS X 上可能并非如此,它可能更像 /dev/urandom
。
【讨论】:
【参考方案2】:获取安全随机数的官方方法是 SecRandomCopyBytes。可悲的是,这是一个 Objective-C 接口。有没有办法在 C++ 中使用这个接口,最好不要求助于 Objective-C++?
SecRandomCopyBytes
是一个 C API。在 C++ 中使用它没有问题。
这是一个完整的例子。不需要 ObjC++,即使使用花哨的vector
之类的东西来表明它都是 C++。显然你可以使用malloc
。
#include <iostream>
#include <Security/Security.h>
#include <vector>
int main(int argc, const char * argv[])
const int length = 20;
std::vector<uint8_t> randomBytes(length, 0);
int rc = SecRandomCopyBytes(kSecRandomDefault, randomBytes.size(), &(randomBytes[0]));
if (rc != 0)
std::cout << "Failed: " << rc << std::endl;
return 1;
for (int i = 0; i < randomBytes.size(); ++i)
std::cout << std::hex << +randomBytes[i] << " ";
std::cout << std::endl;
return 0;
【讨论】:
以上是关于在 iOS 上使用 C++ 获取加密安全的随机数的主要内容,如果未能解决你的问题,请参考以下文章