2017-06-17 75 views
1

在一個應用程序的每一次啓動,128位的隨機消息應該被創建,使得所述消息之前尚未與最大概率選擇和這也應該是安全的(即,不能由一些黑客被打破)。例如,使用帶有從系統中獲取的種子的標準隨機生成器是不安全的,因爲它可以通過以某種方式凍結系統時間來破壞(這是否有可能?)。C++:便攜式替代CryptGenRandom

Windows函數CryptGenRandom似乎是適宜的。但是有沒有便攜式替代品?如果沒有,Linux和Mac有相應的功能嗎?

+1

這可能不是那麼容易。一些評論(儘管有點過於自信地提出了imho)可以在這裏找到(http://www.pcg-random.org/posts/simple-portable-cpp-seed-entropy.html)。核心信息是,std :: random_device可能有一些缺陷,但我從來沒有接觸過它,也許它會幫助你。儘管如此,你的問題有點寬泛。也許只是把你的cryptoPRNG的當前狀態保存在本地數據庫或文件中會容易得多,這很容易做到(只需要1個init;碰撞概率可以忽略不計)。但是,這當然取決於確切的用例。 – sascha

+0

@sascha:有趣的鏈接,以及std :: random_device可能會有用。謝謝,這很有幫助! –

回答

3

Windows函數CryptGenRandom似乎適合於此。但是有沒有便攜式替代品?

這取決於你如何看待它;我不確定是否有可以直接包裹在平臺RNG上的獨立包裝。但是大多數加密庫都會有一個隨機生成器,它直接引用或更可能從OS隨機數生成器中自行創建種子。

例如,閱讀關於AutoSeeded Crypto ++ here的生成器。這些庫由操作系統提供的功能抽象,讓你保持調用底層平臺到最小的便攜選項(即它們都是安全的快)。

如果不是,是Linux和Mac有相應的功能?

要直接使用密碼隨機,然後使用/dev/urandom。通常沒有理由使用可能阻塞的/dev/random。我會推薦使用經過嚴格審查的圖書館。


特別是如果你使用的是嵌入式的或虛擬的設備& OS它支付,以確保操作系統隨機數發生器是足夠隨機的。例如,對於虛擬化系統,確保爲操作系統安裝虛擬機擴展通常是一個好主意。

附加種子可以被添加到隨機數發生器爲好,所以如果你有任何看起來隨意,你就可能是明智的,如果你不知道的隨機數的保力加作爲種子。

經與RNG擴展(由OS或庫使用的),例如英特爾RD_RAND一個CPU可能是有意義的,以及過程的。