簡體   English   中英

random.nextBytes(bytes)如何在生成種子后生成字節

[英]How random.nextBytes(bytes) generates the bytes after we have seed

我知道如果我們宣布:

SecureRandom random=new SecureRandom();

它初始化默認算法以生成隨機數是NativePRNG ,其讀取/dev/random以生成真正隨機的seed 現在我們有一個160位大小的真正隨機seed ,但我很困惑當我們調用random.nextBytes(bytes);時會發生什么random.nextBytes(bytes); 它如何從seed生成bytes ,它是否再次讀取/dev/random或其他內容。

謝謝。

注意: 我在linux / MAC框中尋找java 7中的默認行為。

從Java API文檔:

許多SecureRandom實現采用偽隨機數生成器(PRNG)的形式,這意味着它們使用確定性算法從真正的隨機種子生成偽隨機序列。 其他實現可以產生真正的隨機數,而其他實現可以使用兩種技術的組合。

那么nextBytes(bytes)是否從/dev/random返回真正的隨機字節,或者它是否返回從真正的隨機種子生成的偽隨機數取決於。 第二種情況意味着使用初始隨機種子,通過對SecureRandom任何調用生成確定性但看似隨機(因此,偽隨機)數字序列。

Java 7允許指定可配置的PRNG源,但在Linux上,默認值為NativePRNG ,在Windows SHA1PRNG 您也可以在Linux上指定SHA1PRNG ,但NativePRNG的默認選項更好。 SHA1PRNG通過使用SHA1生成PRNG位和字節。 在Linux(以及可能的其他Unix,其機制是“ NativePRNG ”)上,算法從/dev/random/dev/urandom讀取,因此只要有足夠的熵可用於其中任何一個。 為了完整起見,從random的Linux手冊頁中:

從/ dev / urandom設備讀取不會阻止等待更多的熵。 結果,如果熵池中沒有足夠的熵,則理論上返回的值易受對驅動程序使用的算法的加密攻擊。

因此,至少在Linux上,由於熵不足,你的SecureRandom會有一定數量的真隨機輸出直到/dev/random阻塞, 但是如果你請求太多的隨機位,它們最終將由底層/dev/urandom機器,可以在PRNG中使用SHA1或其他一些加密哈希算法

最好在沒有自己指定任何顯式種子的情況下創建SecureRandom ,因為它會使用良好的種子自行播種(默認情況下通過/dev/random/dev/urandom用於Linux上的NativePRNG )。 每隔幾分鍾調用nextBytes(bytes) ,即使是大量的字節,也幾乎不會在任何情況下成為問題。 即使您使用的是NativePRNG ,它NativePRNG通過類似SHA-1的方式從/dev/urandom獲取偽隨機字節,但這種輸出仍然非常難以預測。

如果你要求千兆字節的隨機性,重新播種可能是好的,要么使用SecureRandom本身的一些輸出,要么提供你自己的種子。 請注意,為setSeed()提供任何類型的種子都應該是安全的,因為SecureRandom通過將您提供的種子和之前的種子提供給SHA-1或其他加密散列算法等內部來增強當前種子。 但是,最好在不提供種子的情況下創建初始SecureRandom

暫無
暫無

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

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