[英]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.