• SecureRandom的正确使用


    1. 什么是安全的随机数?

    在安全应用场景,随机数应该使用安全的随机数。密码学意义上的安全随机数,要求必须保证其不可预测性

    2. 怎么得到安全的随机数

    可以直接使用真随机数产生器产生的随机数。或者使用真随机数产生器产生的随机数做种子,输入密码学安全的伪随机数产生器产生密码学安全随机数。

    非物理真随机数产生器有:

    1. Linux操作系统的/dev/random设备接口
    2. Windows操作系统的CryptGenRandom接口

    密码学安全的伪随机数产生器,包括JDK的java.security.SecureRandom等。

    本文主要讨论SecureRandom

    3. SecureRandom最佳实践

    3.1 基本用法

    java.security.SecureRandom基本用法:

    byte[] values = new byte[128];
    SecureRandom random = new SecureRandom();
    random.nextBytes(values);
    

    3.2 关于种子的设置

    要保证得到安全的随机数,需要使用真随机数产生器产生的随机数做种子。

    可能的不当用法

     byte[] salt = new byte[128];
     SecureRandom secureRandom = new SecureRandom();
     secureRandom.setSeed(System.currentTimeMillis());  //使用系统时间作为种子
     secureRandom.nextBytes(salt);
    

    此处指定了当前系统时间作为种子,替代系统默认随机源。如果同一毫秒连续调用,则得到的随机数则是相同的。

    小结:不要自己指定种子。应当使用系统随机源。

    系统默认的随机源是什么?

    这取决于$JAVA_HOME/jre/lib/security/java.security配置中的securerandom.source属性。例如jdk1.8中该配置为:

    securerandom.source=file:/dev/random
    

    使用无参构造函数实例化SecureRandom,在大多数系统中,默认的算法是“nativePRNG”,从/dev/random获取随机数。

    3.3 熵源不足时阻塞问题

    概念回顾

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

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

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

    解决方法
    提高系统随机数产生器产生随机数速度的一种方法:

    • 采用haveged守护进程增加系统熵池熵值以提高/dev/random读取随机数的速度。

    4. 小结

    1. SecureRandom的使用可以采用无参构造方法实例化,无需手动设置种子。
    2. 如果出现了熵源不足获取随机数阻塞的问题,再进一步优化即可。
    3. 不是安全场景的随机数,使用Random就好。
    eaglediao
     
     转自:https://www.cnblogs.com/eaglediao/p/9291339.html
  • 相关阅读:
    [Daily Coding Problem 223] O(1) space in order traversal of a binary tree
    [Daily Coding Problem 224] Find smallest positive integer that is not the sum of a subset of a sorted array
    Sliding Window Algorithm Questions
    Sweep Line Algorithm Summary
    Palindrome Algorithm Questions
    Core Data Structures, Algorithms and Concepts
    [LeetCode] 1000. Minimum Cost to Merge Stones
    UVA 253 Cube painting(枚举 模拟)
    Codeforces 821C Okabe and Boxes
    Codeforce 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集&分组背包)
  • 原文地址:https://www.cnblogs.com/javalinux/p/14254291.html
Copyright © 2020-2023  润新知