Dan*_*her 5 c++ security random cryptography ios
我正在开发一个用Objective-C和C++编写的iOS应用程序.在C++部分,我需要加密安全的随机数.
据我了解iOS安全模型,无法/dev/random直接访问.那是对的吗?
获得安全随机数的官方方法是SecRandomCopyBytes.遗憾的是,这是一个Objective-C接口.有没有办法从C++使用这个接口,理想情况下不使用Objective-C++?
还有arc4random,但我现在不愿意使用任何基于RC4的东西......
在任何基于"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.
获得安全随机数的官方方法是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)
| 归档时间: |
|
| 查看次数: |
2288 次 |
| 最近记录: |