2015-09-24 52 views
4

我正在研究用Objective-C和C++編寫的iOS應用程序。在C++部分中,我需要密碼保護隨機數。在iOS上用C++獲取加密安全的隨機數

  1. 據我瞭解的iOS安全模型,沒有辦法直接訪問/dev/random。那是對的嗎?

  2. 官方的方式來獲得安全的隨機數是SecRandomCopyBytes。可悲的是,這是一個Objective-C界面。有沒有辦法從C++使用這個接口,理想情況下不需要使用Objective-C++?

還有arc4random,但我不願意使用是基於RC4時下什麼...

回答

4

官方的方式來獲得安全隨機數是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; 
} 
+0

太好了,謝謝。 –

6

一種方式來獲得任何「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