`

java中的SecureRandom在linux中的实现和windows不同坑很深

 
阅读更多

      自身有一套OA源码,在windows开发和部署都没有问题,在linux和os里面就无法部署一致爆无法解密,找了很多方法,因为本身项目中用的rcs的方式以为是加密java的jdk版本换了跟windows一样还是不可以。

      在Linux操作系统中,有一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。

/dev/random

在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到从别的设备中收集到了足够的环境噪声为止。

当然你也可以设置成不堵塞,当你在open 的时候设置参数O_NONBLOCK, 但是当你read的时候,如果熵池空了,会返回-1

/dev/urandom

/dev/random的一个副本是/dev/urandom ("unlocked",非阻塞的随机数发生器[4]),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

 

 

Linux下设置随机数

/proc/sys/kernel/random

在此目录下,可以配置/dev/random的参数

Poolsize

The file poolsize gives the size of the entropy pool

Read-wakeup_threadhold

The file read_wakeup_threshold contains the number of bits ofentropy required for waking up processes that sleep waiting for entropy from /dev/random.  The default is 64. 

write_wakeup_threshold

The filewrite_wakeup_threshold contains the number of bits of entropy below which wewake up processes that do a select(2) or poll(2) for write access to /dev/random.

 

在JAVA中的配置发生器

Java中可以通过两种方式去设置指定的随机数发生器

1.      在tomcat下catalina.sh中最上边添加

         -Djava.security.egd=file:/dev/random或者 -Djava.security.egd=file:/dev/urandom

2.      修改jvm的计算方式

修改配置文件java.security 在jvm_home\jre\lib\security

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

/dev/random 是堵塞的,在读取随机数的时候,当熵池值为空的时候会堵塞影响性能,尤其是系统大并发的生成随机数的时候,如果在随机数要求不高的情况下,可以去读取/dev/urandom

整个流程如下:

JAVA中首先读取系统参数java.security.egd,如果值为空的时候,读取java.security配置文件中的参数securerandom.source, 在通常情况下,就是读取参数securerandom.source,默认值是/dev/urandom,也就是因该是不堵塞的。

但实际情况是,在测试linux环境下的时候,你会发现默认值却是堵塞的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics