SpringBoot项目中访问controller接口报Creation of SecureRandom instance for session ID generation using

bug原因

今天测试人员在测试的时候发现获取图形验证码接口在访问时候加载速度非常慢,要一两分钟才能加载出来,看日志的时候发现报了下边的一段警告日志:

1
2
2019-01-24 09:36:33.654 [http-nio-8080-exec-5] WARN org.apache.catalina.util.SessionIdGeneratorBase:180 - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [106,771] milliseconds.
2019-01-24 09:36:33.656 [http-nio-8080-exec-3] WARN org.apache.catalina.util.SessionIdGeneratorBase:180 - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [26,105] milliseconds.

通过搜索发现原因如下

1
2
3
4
5
6
7
linux默认的SecureRandom实现方式是非常慢的NativePRNG,而在Windows上的默认实现是SHA1PRNG,你也可以在Linux上指定使用该方式。

……NativePRNG会不断从操作系统获取熵(从/dev/urandom读取),其它PRNG则不会获取这些额外的熵。

AESCounterRNG差不多比SHA1PRNG快的十倍,而如果我没记错,SHA1PRNG比NativePRNG快两到三倍

SecureRandom是java用来获取高级随机数的实现,而访问获取图形验证码接口速度很慢的原因就是因为在linux上项目生成随机数的时候使用的是最慢的NativePRNG导致的

解决办法

  1. 在 JVM 环境中解决(我在项目中使用的是这种方式)
    打开$JAVA_PATH/jre/lib/security/java.security这个文件找到修改该securerandom.source的值

    1
    2
    3
    4
    5
    修改前
    securerandom.source=file:/dev/random

    修改后
    securerandom.source=file:/dev/./urandom

    如果为SpringBoot项目可以在执行jar启动命令中添加配置

    1
    2
    3
    4
    5
    修改前
    java -jar pc.jar

    修改后
    java -jar -Djava.security.egd=file:/dev/./urandom pc.jar
  2. 在Tomcat环境中解决

    1
    2
    可以通过配置 JRE 使用非阻塞的 Entropy Source:
    在 catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。

作者: 只是学习学习
邮箱: fengzxia1000@163.com
原文地址: https://fengzxia.gitee.io/posts/56379dd4.html
版权声明: 商业转载请联系作者获得授权,非商业转载请注明出处。