【问题标题】:Getting cryptographically secure random numbers in C++ on iOS在 iOS 上使用 C++ 获取加密安全的随机数
【发布时间】:2015-09-24 17:57:31
【问题描述】:

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

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

  2. 获取安全随机数的官方方法是SecRandomCopyBytes。可悲的是,这是一个 Objective-C 接口。有没有办法在 C++ 中使用这个接口,最好不要求助于 Objective-C++?

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

【问题讨论】:

    标签: c++ ios security random cryptography


    【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 2016-02-08
        • 2016-09-07
        • 1970-01-01
        相关资源
        最近更新 更多