我正在研究用Objective-C和C++編寫的iOS應用程序。在C++部分中,我需要密碼保護隨機數。在iOS上用C++獲取加密安全的隨機數
據我瞭解的iOS安全模型,沒有辦法直接訪問
/dev/random
。那是對的嗎?官方的方式來獲得安全的隨機數是SecRandomCopyBytes。可悲的是,這是一個Objective-C界面。有沒有辦法從C++使用這個接口,理想情況下不需要使用Objective-C++?
還有arc4random,但我不願意使用是基於RC4時下什麼...
我正在研究用Objective-C和C++編寫的iOS應用程序。在C++部分中,我需要密碼保護隨機數。在iOS上用C++獲取加密安全的隨機數
據我瞭解的iOS安全模型,沒有辦法直接訪問/dev/random
。那是對的嗎?
官方的方式來獲得安全的隨機數是SecRandomCopyBytes。可悲的是,這是一個Objective-C界面。有沒有辦法從C++使用這個接口,理想情況下不需要使用Objective-C++?
還有arc4random,但我不願意使用是基於RC4時下什麼...
官方的方式來獲得安全隨機數是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;
}
一種方式來獲得任何「C」型語言,包括斯威夫特加密安全隨機數是「C」 arc4random功能。
對於隨機數整數(u_int32_t)使用arc4random()
和arc4random_uniform()
。
對於範圍內的隨機字節使用arc4random_buf()
函數填充長度爲nbytes與ARC4衍生隨機數據的緩衝區。
RC4是arc4random的一部分,關鍵是不斷播種:
的arc4random()函數非常迅速地提供高質量的32位僞隨機數。 arc4random()從隨機(4)中描述的內核強隨機數子系統中有規律地自我種植。
arc4random source code可用。請注意,它是通過從/dev/urandom
讀取部分播種(攪動)。注意避免衆所周知的RC4弱點。另外,當初始化狀態時包括時間,使得不可能再生兩次相同的隨機序列。
注意:儘管文檔聲明/dev/random
阻塞了熵的缺失,但在OS X上可能並不是這樣,它可能更像/dev/urandom
。
太好了,謝謝。 –