java项目响应时间慢_服务响应时间慢:Java SecureRandom和/ dev / random

小编典典

我无法检查您的OpenJDK具体版本,但可以检查jdk6-b33。

public byte[] engineGenerateSeed(int numBytes) {

byte[] b = new byte[numBytes];

SeedGenerator.generateSeed(b);

return b;

}

SeedGenerator

seedSource从SunEntries获取(String)

String egdSource = SunEntries.getSeedSource();

SunEntries尝试java.security.egd首先从系统属性获取源,如果找不到,则尝试securerandom.source从java.security属性文件获取属性,如果找不到属性,则返回空白字符串。

// name of the *System* property, takes precedence over PROP_RNDSOURCE

private final static String PROP_EGD = "java.security.egd";

// name of the *Security* property

private final static String PROP_RNDSOURCE = "securerandom.source";

final static String URL_DEV_RANDOM = "file:/dev/random";

final static String URL_DEV_URANDOM = "file:/dev/urandom";

private static final String seedSource;

static {

seedSource = AccessController.doPrivileged(

new PrivilegedAction() {

public String run() {

String egdSource = System.getProperty(PROP_EGD, "");

if (egdSource.length() != 0) {

return egdSource;

}

egdSource = Security.getProperty(PROP_RNDSOURCE);

if (egdSource == null) {

return "";

}

return egdSource;

}

});

}

在SeedGenerator检查该值初始化该实例

// Static instance is created at link time

private static SeedGenerator instance;

private static final Debug debug = Debug.getInstance("provider");

final static String URL_DEV_RANDOM = SunEntries.URL_DEV_RANDOM;

final static String URL_DEV_URANDOM = SunEntries.URL_DEV_URANDOM;

// Static initializer to hook in selected or best performing generator

static {

String egdSource = SunEntries.getSeedSource();

// Try the URL specifying the source

// e.g. file:/dev/random

//

// The URL file:/dev/random or file:/dev/urandom is used to indicate

// the SeedGenerator using OS support, if available.

// On Windows, the causes MS CryptoAPI to be used.

// On Solaris and Linux, this is the identical to using

// URLSeedGenerator to read from /dev/random

if (egdSource.equals(URL_DEV_RANDOM) || egdSource.equals(URL_DEV_URANDOM)) {

try {

instance = new NativeSeedGenerator();

if (debug != null) {

debug.println("Using operating system seed generator");

}

} catch (IOException e) {

if (debug != null) {

debug.println("Failed to use operating system seed "

+ "generator: " + e.toString());

}

}

} else if (egdSource.length() != 0) {

try {

instance = new URLSeedGenerator(egdSource);

if (debug != null) {

debug.println("Using URL seed generator reading from "

+ egdSource);

}

} catch (IOException e) {

if (debug != null)

debug.println("Failed to create seed generator with "

+ egdSource + ": " + e.toString());

}

}

// Fall back to ThreadedSeedGenerator

if (instance == null) {

if (debug != null) {

debug.println("Using default threaded seed generator");

}

instance = new ThreadedSeedGenerator();

}

}

如果来源是

final static String URL_DEV_RANDOM = "file:/dev/random";

要么

final static String URL_DEV_URANDOM = "file:/dev/urandom"

使用NativeSeedGenerator,在Windows上尝试使用原生CryptoAPILinux上的类简单地扩展SeedGenerator.URLSeedGenerator

package sun.security.provider;

import java.io.IOException;

/**

* Native seed generator for Unix systems. Inherit everything from

* URLSeedGenerator.

*

*/

class NativeSeedGenerator extends SeedGenerator.URLSeedGenerator {

NativeSeedGenerator() throws IOException {

super();

}

}

并调用/dev/random默认加载的超类构造函数

URLSeedGenerator() throws IOException {

this(SeedGenerator.URL_DEV_RANDOM);

}

因此,/dev/random在您未在系统属性java.security.egd或securerandom.source安全属性文件的属性中设置另一个值之前,OpenJDK

默认使用。

如果要使用阅读结果strace,可以更改命令行并添加trace=open,read表达式

sudo strace -o a.strace -f -e trace=open,read java class

您可以看到类似的内容(我使用Oracle JDK 6进行了测试)

13225 open("/dev/random", O_RDONLY) = 8

13225 read(8, "@", 1) = 1

13225 read(3, "PK\3\4\n\0\0\0\0\0RyzB\36\320\267\325u\4\0\0u\4\0\0 \0\0\0", 30) = 30

....

....

如果您在启动过程中遇到延迟,请参阅“ Tomcat Wiki”部分中有关启动更快的建议,使用/ dev / urandom之类的非阻塞熵源

更多信息:https

:

//wiki.apache.org/tomcat/HowTo/FasterStartUp#Entropy_Source

希望这可以帮助。

2020-06-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值