安全随机数生成器。
实例化
SecureRandom
的实例化方法比较多,可以使用其公开的构造方法进行初实例化,也可以使用其静态实例化方法getInstance
方法进行实例化。
其可用构造方法如下:
// 无参默认构造方法
public SecureRandom()
// 传一个字节数组作为种子的构造方法
public SecureRandom(byte seed[])
其可用的静态实例化方法如下:
public static SecureRandom getInstance(String algorithm)
throws NoSuchAlgorithmException
public static SecureRandom getInstance(String algorithm,
Provider provider) throws NoSuchAlgorithmException
public static SecureRandom getInstance(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException
通常我们使用默认的无参构造方法进行初始化(如果自己指定种子,方法不对时可能无法达到随机目的)。由于目前支持的算法只有一个SHA1PRNG
,所以也不必再关心静态实例化方法了。
可用方法
-
generateSeed(int size);
返回给定字节数量的种子 -
getAlgorithm();
返回算法名称 -
getInstance(String algorithm);
返回实现指定随机数生成器 RNG 算法的 SecureRandom 对象。支持的随机算法只有一个SHA1PRNG
,有多个重载方法 -
getSeed();
返回给定的种子字节数量 -
nextBytes(byte[] bytes);
生成随机字节数组填充参数中的字节数组 -
setSeed(byte[] seed);
重新设置此随机对象的种子,有重载方法
因为继承了 java.util.Random 类,所以诸如 nextInt,nextDouble 等方法都是可以用的。
熵源不足时阻塞问题
概念:
- "熵值":即是随机值的不确定性度量值。
- "熵源":即是随机数的来源。
- "熵输入":是伪随机数产生器描述从熵源获取的bit串,用来产生种子。
- "种子":即是输入到伪随机数产生器用于初始化的bit串。
问题描述:
在Linux系统中,/dev/random是系统提供的安全随机数接口。当通过/dev/random读取随机数的速度可以为产品所接受时,可以直接使用/dev/random读取的随机数。
有时无法满足产品对随机数的使用要求,熵源不足时存在阻塞,会导致得到随机数的速度太慢。
在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。
解决方法:
提高系统随机数产生器产生随机数速度的一种方法:采用haveged守护进程增加系统熵池熵值以提高/dev/random读取随机数的速度。