簡體   English   中英

Java:使用DRBG SecureRandom時如何設置隨機數?

[英]Java: How do I set the nonce when using DRBG SecureRandom?

Java 9引入了一個新的名為DRBG的SecureRandom。 我想用它來確定性地生成隨機數。 問題在於它在內部使用一個隨時更改的隨機數,因此對於相同的種子,我不會得到相同的數字。 它的內部確實有一個選項可以設置該隨機數,但是我找不到任何可以完成該操作的公共方法。 如何更改該隨機數?

SecureRandom類仍聲明:

此外, SecureRandom必須產生不確定的輸出。

盡管列出的DRBG方案是確定性的,但它們仍將由運行時環境播種,該運行時環境通常從操作系統中檢索熵。


在這方面,“ DRBG”的含義可能有些混亂。 盡管底層算法本質上是確定性的,但這僅意味着它依賴於種子中的熵來生成位流。 即使這些隨機位僅包含有限數量的熵,它們在計算上與隨機也無法區分。 如果對手可以猜到種子,那么整個流就可以知道了。 但是,如果種子包含足夠的熵,那么實際上是不可能的。

“ DRBG”僅指一種預先配置且定義明確的NIST標准化算法(可以在該問題的答案中看到)。 因此,它與“ SHA1PRNG”不同。 “ SHA1PRNG”是Sun專有的算法,完全沒有指定,其他實現(例如Android中的實現)既不同又不安全。 Java的早期版本確實允許您從種子中的“ SHA1DRBG”確定性地生成安全隨機值, 然后再從其中檢索任何輸出。


可以自己創建一個SecureRandomSpi 確定的,但你違反了合同SecureRandomSpi 如果這樣做,您當然必須實現提供程序。

實施SecureRandomSpi將是正確的方法,但是請注意,您實際上可以從SecureRandom繼承,因此有一點捷徑(如果有一點黑話)。

為了具有快速,確定性的“隨機”實現,您可能需要在下面使用流密碼。 這比DRBG更有效,並且它不具有例如重新播種的功能,而您絕對可以沒有這些功能。 可能還需要實現一個KDF來生成DRBG所需的密鑰。

如果您采用這種方式,那么請先明確指定協議,否則開發人員將不得不對您的代碼進行反向工程,以獲取所使用的算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM