在 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++ 获取加密安全的随机数的主要内容,如果未能解决你的问题,请参考以下文章

如何安全的存储用户密码?

多线程环境下生成随机数

为什么要使用ThreadLocalRandom代替Random生成随机数

数据库存储安全之(MD5+盐)加密

PHP开发api接口安全验证

加密算法与随机数生成算法