小編給大家分享一下Tomcat啟動(dòng)時(shí)SecureRandom非常慢怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的東莞網(wǎng)站建設(shè)公司,東莞接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行東莞網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
Tomcat 啟動(dòng)時(shí) SecureRandom 非常慢解決辦法
最近使用阿里云的 Ubuntu 16.04 ESC 服務(wù)器運(yùn)行 Tomcat 時(shí)發(fā)現(xiàn),Tomcat 啟動(dòng)的特別慢,通過(guò)查看日志,發(fā)現(xiàn)時(shí)間主要花在實(shí)例化 SecureRandom 對(duì)象上了。
由該日志可以看出,實(shí)例化該對(duì)象使用了253秒,導(dǎo)致整個(gè)應(yīng)用啟動(dòng)了275秒之久。
注意這條日志:
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [253,251] milliseconds.
根本原因是 SecureRandom 這個(gè) jre 的工具類(lèi)的問(wèn)題。那為什么 SecureRandom generateSeed 這么慢,甚至掛在 Linux 操作系統(tǒng)呢?
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類(lèi)產(chǎn)生安全隨機(jī)類(lèi) SecureRandom 的實(shí)例作為會(huì)話 ID。
Tomcat 使用 SHA1PRNG 算法是基于 SHA-1 算法實(shí)現(xiàn)且保密性較強(qiáng)的偽隨機(jī)數(shù)生成器。
在 SHA1PRNG 中,有一個(gè)種子產(chǎn)生器,它根據(jù)配置執(zhí)行各種操作。
Linux 中的隨機(jī)數(shù)可以從兩個(gè)特殊的文件中產(chǎn)生,一個(gè)是 /dev/urandom,另外一個(gè)是 /dev/random。他們產(chǎn)生隨機(jī)數(shù)的原理是利用當(dāng)前系統(tǒng)的熵池來(lái)計(jì)算出固定一定數(shù)量的隨機(jī)比特,然后將這些比特作為字節(jié)流返回。熵池就是當(dāng)前系統(tǒng)的環(huán)境噪音,熵指的是一個(gè)系統(tǒng)的混亂程度,系統(tǒng)噪音可以通過(guò)很多參數(shù)來(lái)評(píng)估,如內(nèi)存的使用,文件的使用量,不同類(lèi)型的進(jìn)程數(shù)量等等。如果當(dāng)前環(huán)境噪音變化的不是很劇烈或者當(dāng)前環(huán)境噪音很小,比如剛開(kāi)機(jī)的時(shí)候,而當(dāng)前需要大量的隨機(jī)比特,這時(shí)產(chǎn)生的隨機(jī)數(shù)的隨機(jī)效果就不是很好了。
這就是為什么會(huì)有 /dev/urandom 和 /dev/random 這兩種不同的文件,后者在不能產(chǎn)生新的隨機(jī)數(shù)時(shí)會(huì)阻塞程序,而前者不會(huì)(ublock),當(dāng)然產(chǎn)生的隨機(jī)數(shù)效果就不太好了,這對(duì)加密解密這樣的應(yīng)用來(lái)說(shuō)就不是一種很好的選擇。/dev/random 會(huì)阻塞當(dāng)前的程序,直到根據(jù)熵池產(chǎn)生新的隨機(jī)字節(jié)之后才返回,所以使用 /dev/random 比使用 /dev/urandom 產(chǎn)生大量隨機(jī)數(shù)的速度要慢。
SecureRandom generateSeed 使用 /dev/random 生成種子。但是 /dev/random 是一個(gè)阻塞數(shù)字生成器,如果它沒(méi)有足夠的隨機(jī)數(shù)據(jù)提供,它就一直等,這迫使 JVM 等待。鍵盤(pán)和鼠標(biāo)輸入以及磁盤(pán)活動(dòng)可以產(chǎn)生所需的隨機(jī)性或熵。但在一個(gè)服務(wù)器缺乏這樣的活動(dòng),可能會(huì)出現(xiàn)問(wèn)題。
有2種解決方案:
1. 在Tomcat環(huán)境中解決:
可以通過(guò)配置 JRE 使用非阻塞的 Entropy Source:
在 catalina.sh 中加入這么一行:-Djava.security.egd=file:/dev/./urandom 即可。
2. 在 JVM 環(huán)境中解決:
打開(kāi) $JAVA_PATH/jre/lib/security/java.security 這個(gè)文件,找到下面的內(nèi)容:
securerandom.source=file:/dev/random
替換成:
securerandom.source=file:/dev/./urandom
這里值為何要在 dev 和 random 之間加一個(gè)點(diǎn)呢?是因?yàn)橐粋€(gè) JDK 的 bug,有人反饋即使對(duì) securerandom.source 設(shè)置為 /dev/urandom 它也仍然使用的 /dev/random,有人提供了變通的解決方法,其中一個(gè)變通的做法是對(duì) securerandom.source 設(shè)置為 /dev/./urandom 才行。也有人評(píng)論說(shuō)這個(gè)不是 bug,是有意為之。
在 JDK 7 的 java.security 文件里,配置里的是:
# Select the source of seed data for SecureRandom. By default an # attempt is made to use the entropy gathering device specified by # the securerandom.source property. If an exception occurs when # accessing the URL then the traditional system/thread activity # algorithm is used. # # On Solaris and Linux systems, if file:/dev/urandom is specified and it # exists, a special SecureRandom implementation is activated by default. # This "NativePRNG" reads random bytes directly from /dev/urandom. # # On Windows systems, the URLs file:/dev/random and file:/dev/urandom # enables use of the Microsoft CryptoAPI seed functionality. # securerandom.source=file:/dev/urandom
但這個(gè) /dev/urandom 也同那個(gè) bug 報(bào)告里所說(shuō)的等同于 /dev/random;要使用非阻塞的熵池,這里還是要修改為 /dev/./urandom。經(jīng)測(cè)試,貌似 JDK 7 并沒(méi)有同注釋里的意思修復(fù)了這個(gè)問(wèn)題。
以上是“Tomcat啟動(dòng)時(shí)SecureRandom非常慢怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!