在iOS上使用C ++获取加密安全随机数

时间:2015-09-24 17:57:31

标签: c++ ios security random cryptography

我正在开发一个用Objective-C和C ++编写的iOS应用程序。在C ++部分,我需要加密安全随机数。

  1. 据我了解iOS安全模型,无法直接访问/dev/random。这是对的吗?

  2. 获取安全随机数的官方方法是SecRandomCopyBytes。遗憾的是,这是一个Objective-C接口。有没有办法从C ++使用这个接口,理想情况下不使用Objective-C ++?

  3. 还有arc4random,但我现在不愿意使用任何基于RC4的东西......

2 个答案:

答案 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;
}