原因:
Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產(chǎn)生安全隨機(jī)類SecureRandom的實例作為會話ID缓艳,這里花去了62秒,也即接近1分鐘,當(dāng)然有時花費(fèi)時間更長,達(dá)到5-10分鐘。
SHA1PRNG算法是基于SHA-1算法實現(xiàn)且保密性較強(qiáng)的偽隨機(jī)數(shù)生成器寄锐。
在SHA1PRNG中,有一個種子產(chǎn)生器,它根據(jù)配置執(zhí)行各種操作要尔。
1)如果Java.security.egd 屬性或securerandom.source屬性指定的是”file:/dev/random”或”file:/dev/urandom”,那么JVM 會使用本地種子產(chǎn)生器NativeSeedGenerator新娜,它會調(diào)用super()方法盈电,即調(diào)用 SeedGenerator.URLSeedGenerator(/dev/random)方法進(jìn)行初始化。
2)如果java.security.egd屬性或securerandom.source屬性指定的是其它已存在的URL杯活,那么會調(diào)用SeedGenerator.URLSeedGenerator(url)方法進(jìn)行初始化匆帚。
這就是為什么我們設(shè)置值為”file:///dev/urandom”或者值為”file:/./dev/random”都會起作用的原因。
在這個實現(xiàn)中旁钧,產(chǎn)生器會評估熵池(entropy pool)中的噪聲數(shù)量吸重。隨機(jī)數(shù)是從熵池中進(jìn)行創(chuàng)建的。當(dāng)讀操作時歪今,/dev/random設(shè)備會只返回熵池中噪聲的隨機(jī)字節(jié)嚎幸。/dev/random非 常適合那些需要非常高質(zhì)量隨機(jī)性的場景,比如一次性的支付或生成密鑰的場景寄猩。
當(dāng)熵池為空時嫉晶,來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環(huán)境噪聲數(shù)據(jù)田篇。這么做的目的是成為一個密碼安全的偽隨機(jī)數(shù)發(fā)生器替废,熵池要有盡可能大的輸出。對于生成高質(zhì)量的加密密鑰或者是需要長期保護(hù)的場景泊柬,一定要這么做椎镣。
那么什么是環(huán)境噪聲?
隨機(jī)數(shù)產(chǎn)生器會手機(jī)來自設(shè)備驅(qū)動器和其它源的環(huán)境噪聲數(shù)據(jù)兽赁,并放入熵池中状答。產(chǎn)生器會評估熵池中的噪聲數(shù)據(jù)的數(shù)量冷守。當(dāng)熵池為空時,這個噪聲數(shù)據(jù)的收集是比較花時間的惊科。這就意味著拍摇,Tomcat在生產(chǎn)環(huán)境中使用熵池時,會被阻塞較長的時間馆截。
解決:
有兩種解決辦法:
1)在Tomcat環(huán)境中解決
可以通過配置JRE使用非阻塞的Entropy Source授翻。
在catalina.sh中加入這么一行:
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
即可。
加入后再啟動Tomcat孙咪,整個啟動耗時迅速下降堪唐。
2)在JVM環(huán)境中解決
打開$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內(nèi)容:
securerandom.source=file:/dev/urandom
替換成
securerandom.source=file:/dev/./urandom
http://www.cnblogs.com/suiyueqiannian/p/6060951.html?utm_source=itdadao&utm_medium=referral