• SecureRandom那些事|真伪随机数


    前面的几篇文章,介绍了随机数的几种生成方式,那么什么是伪随机数呢?

    所谓伪随机数,是指只要给定⼀个初始的种⼦,产⽣的随机数序列是完全⼀样的。

    for (int i = 0; i < 10; i++) {
        Random random = new Random(123);
        int randomValue = random.nextInt(10);
        System.out.println(randomValue);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    当我们初始化Random不给定种子的时候,会默认给定当前的时间作为种子。

        /**
         * Creates a new random number generator. This constructor sets
         * the seed of the random number generator to a value very likely
         * to be distinct from any other invocation of this constructor.
         */
        public Random() {
            this(seedUniquifier() ^ System.nanoTime());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    跟踪

         * @return the current value of the running Java Virtual Machine's
         *         high-resolution time source, in nanoseconds
         * @since 1.5
         */
        public static native long nanoTime();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那么,什么是真随机数呢?

    真正的真随机数只能通过量⼦⼒学原理来获取,⽽我们想要的是⼀个不可预测的安全的随机
    数,SecureRandom就是⽤来创建安全的随机数的:

    SecureRandom sr = new SecureRandom();
    System.out.println(sr.nextInt(100));
    
    • 1
    • 2

    SecureRandom⽆法指定种⼦,它使⽤RNG(random number generator)算法。JDK的SecureRandom实际上有多种不同的底层实现,有的使⽤安全随机种⼦加上伪随机数算法来产⽣安全的随机数,有的使⽤真正的随机数⽣成器。

    实际使⽤的时候,可以优先获取⾼强度的安全随机数⽣成器,如果没有提供,再使⽤普通等级的安全随机数⽣成器:

    import java.util.Arrays;
    import java.security.SecureRandom;
    import java.security.NoSuchAlgorithmException;
    public class Main {
        public static void main(String[] args) {
            SecureRandom sr = null;
            try {
           		// 获取⾼强度安全随机数⽣成器
                sr = SecureRandom.getInstanceStrong(); 
            } catch (NoSuchAlgorithmException e) {
                // 获取普通的安全随机数⽣成器
                sr = new SecureRandom(); 
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    SecureRandom的安全性是通过操作系统提供的安全的随机种⼦来⽣成随机数。

    这个种⼦是通过CPU的热噪声、读写磁盘的字节、⽹络流量等各种随机事件产⽣的“熵”。

    在密码学中,安全的随机数⾮常重要。如果使⽤不安全的伪随机数,所有加密体系都将被攻破。

    因此,时刻牢记必须使⽤SecureRandom来产⽣安全的随机数。

  • 相关阅读:
    如何保证 HTTPS 证书的有效性?
    【重识云原生】第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
    MySQL---查询(下篇)
    【Qt基础篇】信号和槽
    `算法题解` `AcWing` 4505. 最大子集
    封装了一个中间放大效果的iOS轮播视图
    CentOS使用Docker搭建Halo网站并实现无公网ip远程访问
    程序猿生成二维码的三种方法(在线接口+在线网站+本地程序)
    C语言每日一题(15) 添加逗号
    万界星空科技可视化数字大屏应用场景及作用
  • 原文地址:https://blog.csdn.net/CSDN_SAVIOR/article/details/125622150