我正在开发一个用Objective-C和C ++编写的iOS应用程序。在C ++部分,我需要加密安全随机数。
据我了解iOS安全模型,无法直接访问/dev/random
。这是对的吗?
获取安全随机数的官方方法是SecRandomCopyBytes。遗憾的是,这是一个Objective-C接口。有没有办法从C ++使用这个接口,理想情况下不使用Objective-C ++?
还有arc4random,但我现在不愿意使用任何基于RC4的东西......
答案 0 :(得分:7)
在任何基于“C”的语言(包括Swift)上获取加密安全随机数的一种方法是“C”arc4random函数。
对于随机数整数(u_int32_t),请使用arc4random()
和arc4random_uniform()
。
对于一系列随机字节,使用arc4random_buf()
函数使用ARC4派生的随机数据填充长度为nbytes的缓冲区。
RC4是arc4random的一部分,关键是连续播种:
arc4random()函数可以非常快速地提供高质量的32位伪随机数。 arc4random()定期从随机(4)中描述的内核强随机数子系统中种子化。
arc4random source code可用。请注意,通过阅读/dev/urandom
部分播种(搅拌)。注意避免众所周知的RC4弱点。另外,在初始化状态时包括时间,使得无法再生两次相同的随机序列。
注意:虽然文档声明/dev/random
阻止了缺少熵,但这可能不适用于OS X,它可能更像/dev/urandom
。
答案 1 :(得分:5)
获得安全随机数的官方方法是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;
}