在随机数安全一文中提过安全随机数的概念 , 这里不具体描述 , 就是指强伪随机数甚至真随机数 . 在Java中除了弱伪随机数生成器java.util.Random
之外 , 也提供了java.security.SecureRandom
这种强伪随机数生成器 . 使用这种方式时 , Java会读取系统默认的随机源 . Java中有两种方法可以改变随机源的来源 :
当两种随即源都存在时,1的优先级高于2 ; JDK1.8中,java.security文件中的securerandom.source的默认值为:file:/dev/random
/dev/random
产生随机数的原理是利用当前系统的**熵池(random pool)**来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回
熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过 很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,这产生的随机数的效果就不是很好了,/dev/random
会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回
由于/dev/random
生成强伪随机数的过程会阻塞当前的程序 , 所以生成随机数的速度必须越快越好 ; 而熵值从小数值升到目标数值的速度就是生成随机数的速度 , 为此 , 我们必须想办法提高熵值
我们可以使用haveged组件来进行补熵
执行service haveged status
或者ps –ef | grep "haveged" | grep -v "grep"
命令可以确认系统是否开启了haveged进程
启动haveged , 并将其设置为随系统启动 :
systemctl start haveged
systemctl enable haveged.service
停止haveged : service haveged stop
在启动完havged后 , 可以通过cat /dev/random | od –x
来查看屏幕输出随机数的速度明显比未开启时要快得多 ; cat /proc/sys/kernel/random/entropy_avail
可以查看当前熵值 ; 没开启havaged正常是100多 , 开启之后会增大到1000多甚至2000