在CodesInChaos已經顯示,SUN提供程序的默認實現自動使用系統隨機數生成器自行播種。由於Java本身沒有(顯式的)熵源,它或多或少依賴於系統的種子。
在SUN提供檢索從"SHA1PRNG"
數據,這將使你的RNG(隨機數發生器)爲確定性RNG之前,您應該調用setSeed
- 它將只使用給定的種子,而不是添加種子的國家。換句話說,它將始終生成相同的僞隨機比特或值的流。
對setSeed
的初始呼叫可能因供應商不同而不同。有時候它會使用種子作爲種子,但它也可能只是將種子添加到當前狀態。在後來的Android版本(4.2版以後)中,種子剛剛添加到隨機狀態,因此"SHA1RNG"
將保持完全隨機。
可能產生的隨機數發生器的最好辦法就是
SecureRandom r = new SecureRandom();
,讓Java運行時找出最佳的一個。
,如果你想使用一個明確的算法(它,然而,由SUN/Oracle的不適所描述的),那麼你可以使用:
SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
在你的代碼。如果你想添加熵,使用方法:
// just used to make sure that the SecureRandom is seeded by the OS
r.nextBytes(new byte[8]);
r.setSeed(1232);
的常數值或文字不包含多少(如果有的話)的熵。熵的一般來源是當前時間(或者甚至更好,System.nanoTime()
),鼠標移動等
對於Java 8有一個新的方法getInstanceStrong()
結合下面的描述:
返回一個SecureRandom通過使用securerandom.strongAlgorithms Security屬性中指定的算法/提供程序選擇的對象。
有些情況下需要較強的隨機值,例如創建RSA公鑰/私鑰等高價值/長期存在的密鑰時。爲了幫助指導應用程序選擇合適的強大的SecureRandom實現,Java發行版在securerandom.strongAlgorithms
Security屬性中包含已知強SecureRandom實現的列表。
應該用哪個替代對構造函數的調用。被警告,這可能會返回一個阻止 RNG,即:一個RNG可能會阻塞你的線程,直到有足夠的熵可用。它也可能會耗盡您的操作系統熵池阻止其他應用程序,所以只能謹慎使用它。
我根本就不會調用'setSeed'。當您不調用'setSeed'時,'SecureRandom'會自動播種。 – CodesInChaos 2014-12-04 16:13:53