美文网首页
JCA 实践记录——SecureRandom

JCA 实践记录——SecureRandom

作者: JSON_NULL | 来源:发表于2019-01-25 10:43 被阅读12次

    安全随机数生成器。

    实例化

    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

          本文链接:https://www.haomeiwen.com/subject/cljsjqtx.html