国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

SecureRandom生成隨機數(shù)超慢 導致tomcat啟動時間過長的解決辦法

2019-11-11 04:40:26
字體:
供稿:網(wǎng)友

使用騰訊云的CentOS 7.2 CVM 服務器跑Tomcat時發(fā)現(xiàn),Tomcat啟動的特別慢,通過查看日志,發(fā)現(xiàn)時間主要花在實例化SecureRandom對象上了。

這里寫圖片描述

由該日志可以看出,實例化該對象使用了460秒,導致整個應用啟動了480秒之久。

根本原因是SecureRandom 這個jre的工具類的問題. 具體內(nèi)容:JDK-6521844 : SecureRandom hangs on linux Systems

那為什么SecureRandom generateSeed這么慢,甚至掛在Linux操作系統(tǒng)呢?

當您登錄時,它掛起或花費超過一分鐘獲得響應。如果你的服務器在Linux操作系統(tǒng)上,這里的罪魁禍首是SecureRandom generateSeed()。它使用/dev/random生成種子。但是/dev/random是一個阻塞數(shù)字生成器,如果它沒有足夠的隨機數(shù)據(jù)提供,它就一直等,這迫使JVM等待。鍵盤和鼠標輸入以及磁盤活動可以產(chǎn)生所需的隨機性或熵。但在一個服務器缺乏這樣的活動,可能會出現(xiàn)問題。

注意這條日志: org.apache.catalina.util.sessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [460,653] milliseconds.

Tomcat 使用SHA1PRNG算法,該算法是基于SHA-1算法實現(xiàn)且保密性較強的偽隨機數(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)方法進行初始化。

2)如果java.security.egd屬性或securerandom.source屬性指定的是其它已存在的URL,那么會調(diào)用SeedGenerator.URLSeedGenerator(url)方法進行初始化。

這就是為什么我們設置值為”file:///dev/urandom”或者值為”file:/./dev/random”都會起作用的原因。

在這個實現(xiàn)中,產(chǎn)生器會評估熵池(entropy pool)中的噪聲數(shù)量。隨機數(shù)是從熵池中進行創(chuàng)建的。當讀操作時,/dev/random設備會只返回熵池中噪聲的隨機字節(jié)。/dev/random非常適合那些需要非常高質(zhì)量隨機性的場景,比如一次性的支付或生成密鑰的場景。

當熵池為空時,來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環(huán)境噪聲數(shù)據(jù)。這么做的目的是成為一個密碼安全的偽隨機數(shù)發(fā)生器,熵池要有盡可能大的輸出。對于生成高質(zhì)量的加密密鑰或者是需要長期保護的場景,一定要這么做。

那么什么是環(huán)境噪聲?

隨機數(shù)產(chǎn)生器會手機來自設備驅(qū)動器和其它源的環(huán)境噪聲數(shù)據(jù),并放入熵池中。產(chǎn)生器會評估熵池中的噪聲數(shù)據(jù)的數(shù)量。當熵池為空時,這個噪聲數(shù)據(jù)的收集是比較花時間的。這就意味著,Tomcat在生產(chǎn)環(huán)境中使用熵池時,會被阻塞較長的時間。

有2種解決方案:

可以通過配置JRE使用非阻塞的Entropy Source: 在catalina.sh中加入這么一行:-Djava.security.egd=file:/dev/./urandom 即可。 加入后再啟動Tomcat,整個啟動耗時下降到Server startup in 20130 ms。 這種方案是在修改隨機數(shù)獲取方式,那這里urandom是啥呢?

/dev/random的一個副本是/dev/urandom(“unblocked”,非阻塞的隨機數(shù)發(fā)生器[4]),它會重復使用熵池中的數(shù)據(jù)以產(chǎn)生偽隨機數(shù)據(jù)。這表示對/dev/urandom的讀取操作不會產(chǎn)生阻塞,但其輸出的熵可能小于/dev/random的。它可以作為生成較低強度密碼的偽隨機數(shù)生成器,不建議用于生成高強度長期密碼。 - - - wikipedia

在JVM環(huán)境中解決 打開$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內(nèi)容:

securerandom.source=file:/dev/random

替換成

securerandom.source=file:/dev/./urandom

參考: 1. Tomcat 8熵池阻塞變慢詳解 2. SecureRandom第一次生成隨機數(shù)非常慢


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西贡区| 龙游县| 阿巴嘎旗| 区。| 革吉县| 石门县| 邹平县| 莱芜市| 习水县| 海淀区| 延寿县| 深泽县| 萍乡市| 阳江市| 百色市| 武陟县| 河北区| 罗田县| 通州市| 兴海县| 孟津县| 芦山县| 七台河市| 南投县| 上蔡县| 皋兰县| 伊春市| 上饶县| 泸西县| 温泉县| 称多县| 叶城县| 大英县| 林周县| 嘉鱼县| 板桥市| 朔州市| 南城县| 理塘县| 浪卡子县| 镇沅|