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

Dan*_*her 5 c++ security random cryptography ios

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

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

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

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

zap*_*aph 7

在任何基于"C"的语言(包括Swift)上获得加密安全随机数的一种方法是"C" arc4随机函数.

对于随机数整数(u_int32_t)使用arc4random()arc4random_uniform().

对于一系列随机字节,使用该arc4random_buf()函数使用ARC4派生的随机数据填充长度为nbytes的缓冲区.

RC4是arc4random的一部分,关键是连续播种:

arc4random()函数可以非常快速地提供高质量的32位伪随机数.arc4random()定期从随机(4)中描述的内核强随机数子系统中种子.

arc4random 源代码可用.请注意,通过阅读(部分)播种(搅拌)/dev/urandom.注意避免众所周知的RC4弱点.另外,在初始化状态时包括时间,使得不可能两次再生相同的随机序列.

注意:虽然文档声明/dev/random阻止缺少熵,但这可能不适用于OS X,它可能更像/dev/urandom.


Rob*_*ier 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;
}
Run Code Online (Sandbox Code Playgroud)