JCA 实践记录——SecureRandom

安全随机数生成器。

实例化

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,所以也不必再关心静态实例化方法了。

可用方法

  1. generateSeed(int size);返回给定字节数量的种子
  2. getAlgorithm();返回算法名称
  3. getInstance(String algorithm);返回实现指定随机数生成器 RNG 算法的 SecureRandom 对象。支持的随机算法只有一个SHA1PRNG,有多个重载方法
  4. getSeed();返回给定的种子字节数量
  5. nextBytes(byte[] bytes);生成随机字节数组填充参数中的字节数组
  6. setSeed(byte[] seed);重新设置此随机对象的种子,有重载方法

因为继承了 java.util.Random 类,所以诸如 nextInt,nextDouble 等方法都是可以用的。

从Random继承的方法

熵源不足时阻塞问题

概念:

  1. "熵值":即是随机值的不确定性度量值。
  2. "熵源":即是随机数的来源。
  3. "熵输入":是伪随机数产生器描述从熵源获取的bit串,用来产生种子。
  4. "种子":即是输入到伪随机数产生器用于初始化的bit串。

问题描述:

在Linux系统中,/dev/random是系统提供的安全随机数接口。当通过/dev/random读取随机数的速度可以为产品所接受时,可以直接使用/dev/random读取的随机数。
有时无法满足产品对随机数的使用要求,熵源不足时存在阻塞,会导致得到随机数的速度太慢。

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

解决方法:

提高系统随机数产生器产生随机数速度的一种方法:采用haveged守护进程增加系统熵池熵值以提高/dev/random读取随机数的速度。

你可能感兴趣的:(JCA 实践记录——SecureRandom)