SecureRandom生成随机数-验证码

目录

一、生成随机数的方法

二、SecureRandom

三、常见使用

四、各种实现及结果验证

五、常见及相关问题总结


一、生成随机数的方法

    Math.random()一随机数
    java.util.Random伪随机数(线性同余法生成)
    java.security.SecureRandom真随机数

二、SecureRandom

SecureRandom使用

(1)指定算法名称

    仅指定算法名称:

    SecureRandom random= SecureRandom.getInstance("SHA1PRNG");
    //系统将确定环境中是否有所请求的算法实现,是否有多个,是否有首选实现。

    既指定了算法名称又指定了包提供程序:

    SecureRandom random= SecureRandom.getInstance("SHA1PRNG","RUN");
     
    //系统将确定在所请求的包中是否有算法实现;如果没有,则抛出异常。

(2)获取SecureRandom对象后,生成随机数

    Integer randNum = random.nextInt();//生成10位数的随机数
     
    Integer randNum = random.nextInt(100);//生成0~99的随机数

三、常见使用

1)生成6为随机验证码

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
String verifyCode = String.valueOf(secureRandom.nextInt(900000) + 100000);

四、各种实现及结果验证

package com.basic;

import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

/**
 * 生成6位随机数的三种实现方式
 * @author libusi
 */
public class Test01 {

    public static void main(String[] args) throws NoSuchAlgorithmException {
        demo1();
        demo2();
        demo3();
        demo4();
    }

    private static void demo1() {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            int intValue = Double.valueOf(Math.random() * 1000000).intValue();
            String random = String.valueOf(intValue);
            String r = (random.length() == 6 && "9".equals(random.substring(0, 1))) ? random : String.valueOf(intValue + 100000);
            list.add(r);
        }
        Collections.sort(list);
        list.forEach(System.out::println);
    }

    private static void demo2() {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            Random random1 = new Random();
            list.add(random1.nextInt(900000) + 100000);
        }
        Collections.sort(list);
        list.forEach(System.out::println);
    }

    private static void demo3() throws NoSuchAlgorithmException {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            String v = String.valueOf(secureRandom.nextInt(900000) + 100000);
            list.add(v);
        }
        Collections.sort(list);
        list.forEach(System.out::println);
    }

    private static void demo4() throws NoSuchAlgorithmException {
        //验证SecureRandom
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            SecureRandom random3 = SecureRandom.getInstance("SHA1PRNG");
            //生成10位数的随机数
            Integer r = random3.nextInt();
            //生成0~99的随机数
            Integer r2 = random3.nextInt(100);
            list.add(r2);
        }
        Collections.sort(list);
        list.forEach(System.out::println);
    }

}

五、常见及相关问题总结

1)SecureRandom.getInstance("SHA1PRNG")初始化慢

Linux环境,在项目中用到了随机数,使用了SecureRandom.getInstance("SHA1PRNG"),发现首次运行,时间极长。

本地是Windows环境,运行并不慢。

修改Linux的JVM环境,打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容

securerandom.source=file:/dev/random替换为securerandom.source=file:/dev/./urandom

查看本地环境后,竟然发现使用的是urandom。
2) 偶遇 JDK 1.8 还未修复的 SecureRandom.getInstance("SHA1PRNG") 之 bug

有用请点赞,养成良好习惯!

补充、交流请留言!