SecureRandom生成隨機數超慢i及其解決方法
阿新 • • 發佈:2018-12-30
原文如下:https://blog.csdn.net/upshi/article/details/54907464
有2種解決方案:
方法1:在Tomcat環境中:
可以通過配置JRE使用非阻塞的 Entropy Source:
在catalina.sh中加入這麼一行:
-Djava.security.egd=file:/dev/./urandom
即可。
加入後再啟動Tomcat,整個啟動耗時下降到Server startup in 20130 ms。
這種方案是在修改隨機數獲取方式,那這裡urandom是啥呢?
/dev/random的一個副本是/dev/urandom(“unblocked”,非阻塞的隨機數發生器[4]),它會重複使用熵池中的資料以產生偽隨機資料。這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。它可以作為生成較低強度密碼的偽隨機數生成器,不建議用於生成高強度長期密碼。 - - - wikipedia
方法2:在JVM環境中解決
開啟$JAVA_PATH/jre/lib/security/java.security這個檔案,找到下面的內容:
securerandom.source=file:/dev/random
替換成
securerandom.source=file:/dev/./urandom
另外,對於 JDK8中的SecureRandom.getInstanceStrong()
,也會有類似的問題。詳見 http://hongjiang.info/java8-nativeprng-blocking/,解決方法如下
使用下面的呼叫
SecureRandom.getInstance("NativePRNGNonBlocking")
而不能使用如下帶預設引數的呼叫。
SecureRandom.getInstanceStrong()