Tip:
打开security的debug log
通过设置参数
-Djava.security.debug=all
可以控制台看到所有security的log

在JAVA中的配置发生器

在JAVA中可以通过两种方式去设置指定的随机数发生器

1.-Djava.security.egd=file:/dev/random或者 -Djava.security.egd=file:/dev/urandom

2.修改配置文件java.security 在jvm_home\jre\lib\security

参数securerandom.source=file:/dev/urandom

/dev/random 是堵塞的,在读取随机数的时候,当熵池值为空的时候会堵塞影响性能,尤其是系统大并发的生成随机数的时候,如果在随机数要求不高的情况下,可以去读取/dev/urandom

整个流程如下:

JAVA中首先读取系统参数java.security.egd,
如果值为空的时候,读取java.security配置文件中的参数securerandom.source,
在通常情况下,就是读取参数securerandom.source,默认值是/dev/urandom,也就是因该是不堵塞的。

但实际情况是,在测试linux环境下的时候,你会发现默认值却是堵塞的。

我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,生成的随机数字完全相同。
所以在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,因为其生成的值其实是可以预测的。
  • SecureRandom类提供加密的强随机数生成器 (RNG)
  • 当然,它的许多实现都是伪随机数生成器 (PRNG) 形式,这意味着它们将使用确定的算法根据实际的随机种子生成伪随机序列
  • 也有其他实现可以生成实际的随机数
  • 还有另一些实现则可能结合使用这两项技术
SecureRandom和Random都是,也是如果种子一样,产生的随机数也一样: 因为种子确定,随机数算法也确定,因此输出是确定的。
只是说,SecureRandom类收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,而不像Random默认使用系统当前时间的毫秒数作为种子,有规律可寻。
SecureRandom generater = new SecureRandom();
System.out.println(generater.nextInt(37)); 

1、创建SecureRandom

内置两种随机数算法,NativePRNG和SHA1PRNG,看实例化的方法了。

1.1 new

通过new来初始化,默认来说会使用NativePRNG算法生成随机数,但是也可以配置-Djava.security参数来修改调用的算法,如果是/dev/[u]random两者之一就是NativePRNG,否则就是SHA1PRNG。
在JVM启动参数这样加就好了,-Djava.security=file:/dev/urandom 或者 -Djava.security=file:/dev/random

1.2 getInstance

可以通过getInstance来初始化对象:
  • 其中需要传参的方法,则传算法名即可,如果不存在算法会抛出异常;
  • 另外需要传参,传两个参数的,第二个参数还可以指定算法程序包。
SecureRandom secureRandom = new SecureRandom();
SecureRandom secureRandom3 = SecureRandom.getInstance("SHA1PRNG");
SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG", "SUN");


2、SecureRandom的使用

通常的nextInt之类的方法就不列举了,和Random的使用是类似的,这里举两个其他方法意思意思。

2.1 nextBytes(byte[] bytes)

Typical callers of SecureRandom invoke the following methods to retrieve random bytes: 
可以获取随机的一个byte数组,注意这里不是返回,这个方法是void返回类型,是直接随机改变了test

SecureRandom random = new SecureRandom();
byte[] test = new byte[20];
random.nextBytes(test);

2.2 generateSeed(int numBytes)

Callers may also invoke the generateSeed method to generate a given number of seed bytes (to seed other random number generators, for example): 
通常,也可以使用generateSeed方法,来获取一个随机的byte数组,这个数组中的数通常可以用来做其他随机生成器的种子
byte seed[] = random.generateSeed(20);

2.3 示例 彩票随机生成器

这是伟哥写的一个彩票生成器的代码,也是从里面我再延伸去学习的SecureRandom,如下:
private List<List<Integer>> generateCakes(int num, int seedLength, int rowLen) {SecureRandom random = new SecureRandom();byte[] seeds = SecureRandom.getSeed(seedLength); //获取随机的byte数组,用来后续作为种子int counter = 0;int realCount = 0;int tmprows = 0;List<List<Integer>> CakesList = new ArrayList<List<Integer>>();while (num > tmprows) {List<Integer> list = new ArrayList<Integer>();while (counter < rowLen) {random.setSeed(seeds); //设置种子int cake = random.nextInt(38); //随机生成0-37的数字if (!list.contains(cake) && 0 != cake) {list.add(cake);counter++;}random.nextBytes(seeds); //随机获取新的byte数组用以作为下次的种子,不断循环realCount++;}Collections.sort(list);pairs++;tmprows++;counter = 0;CakesList.add(list);if (pairs % Constants.MSG_COUNT == 0) {System.out.println(pairs + " cakes generated.");}}System.out.println("乱数取得回数:" + realCount);return CakesList;}


3、其他 关于种子seed获取思路

产生高强度的随机数,有两个重要的因素:种子和算法。当然算法是可以有很多的,但是如何选择种子是非常关键的因素。
如Random,它的种子是System.currentTimeMillis(),所以它的随机数都是可预测的。可预测有什么危险呢,可以看两个案例:
  • 《利用系统时间可预测破解java随机数》
  • 《当随机不够随机:一个在线扑克游戏的教训》
那么如何得到一个近似随机的种子?这里有一个思路:
  • 收集计算机的各种信息,如键盘输入时间,CPU时钟,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,来得到一个近似随机的种子
  • 这样的话,除了理论上有破解的可能,实际上基本没有被破解的可能。而事实上,现在的高强度的随机数生成器都是这样实现的

4、参考链接

  • Java中生成随机数Random、ThreadLocalRandom、SecureRandom
  • API参考 SecureRandom(示例,出错代码)
  • Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)
  • SecureRandom的江湖偏方与真实效果
  • Java 随机数 Random VS SecureRandom

https://www.cnblogs.com/deng-cc/p/8064481.html

转载于:https://www.cnblogs.com/softidea/p/9723711.html

SecureRandom相关推荐

  1. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...

  2. Tomcat启动特慢之SecureRandom问题解决

    tomcat启动日志: 08-Jun-2018 09:23:00.445 WARNING [localhost-startStop-1] org.apache.catalina.util.Sessio ...

  3. Tomcat 启动时 SecureRandom 非常慢解决办法

    最近使用阿里云的 Ubuntu 16.04 ESC 服务器运行 Tomcat 时发现,Tomcat 启动的特别慢,通过查看日志,发现时间主要花在实例化 SecureRandom 对象上了. 由该日志可 ...

  4. java securt 视频,SecureRandom在Java中安全种子

    Is this piece of code safe? SecureRandom randomizer = new SecureRandom(String.valueOf(new Date().get ...

  5. java响应很慢排插_服务响应时间慢:Java SecureRandom和/ dev / random - java

    我正在尝试调试Tomcat上部署的应用程序提供的一些慢速响应. 现在,我主要关注SecureRandom和/dev/random(其他一些可能的原因已被调查并排除). 模式如下: 第一个调用恰好在To ...

  6. java 实现真正的随机数_关于java:SecureRandom的Android实现是否产生真正的随机数?...

    我已经阅读过,一般来说,SecureRandom的一些实现可能会产生真正的随机数. 特别是,Android文档说 instances of this class will generate an in ...

  7. java securerandom使用_Java中的SecureRandom nextBytes()方法

    用户指定的随机字节数可以使用nextBytes()类java.security.SecureRandom中的方法获得.该方法需要一个参数,即一个随机字节数组,它返回用户指定的随机字节. 演示此的程序如 ...

  8. 【java】java 随机数 Random ThreadLocalRandom SecureRandom

    文章目录 1.概述 2.ThreadLocalRandom 2.1 Random 2.2 ThreadLocalRandom 2.2.1 验证会重复 2.2.2 解释 2. Random 和 Thre ...

  9. Tomcat学习总结(18)—— Tomcat启动时org.apache.catalina.util.SessionIdGenerator产生安全随机类SecureRandom的实例慢问题解决

    Tomcat7/8使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRandom的实例 ...

最新文章

  1. keepalived_nginx实现discuz负载均衡和高可用
  2. 4G EPS 中的无线资源类型
  3. 机器学习数据预处理代码汇总(最新更新20年3月1日)
  4. java 三种错误类型 区别_请列举至少三种在java语言中发生“严重错误”的情况...
  5. java异常中Exception捕获不到的异常
  6. Java前端技术汇总
  7. 数据分析工作到底在做什么
  8. Maya 2011, GUI with Qt
  9. WORD2003无法打开WORD2000文档解决方法
  10. X86_64 GNU汇编、寄存器、内嵌汇编
  11. [翻译] 在 Overleaf 中上传项目
  12. python成语接龙源代码,基于Tkinter,带成语解释
  13. 游戏开发经验之游戏App是先做大用户量 还是先盈利呢
  14. 代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)
  15. simulink模块名称显示设置_simulink模块名称继承
  16. Cannot invoke an object which is possibly ‘undefined‘.Vetur(2722)
  17. SYN010E型全国产铷原子钟
  18. 简单明了的介绍了python面向对象编程
  19. Access denied for user 'mysql用户名'@'主机或IP' (using password: YES)'
  20. 机器人 郭启寅_华昌达进军机器人

热门文章

  1. 诺奖得主被曝40多篇论文造假!
  2. AlphaFold证明人工智能可以解决基本的科学问题
  3. 交换机与路由器大战已结束,超大规模计算公司胜出
  4. 未来全球15大热门研究方向出炉!
  5. 工业机器人发展现状:硬件制造大同小异,视觉感知绘新蓝图
  6. 10家最具创新性的机器学习公司
  7. 7个方面读懂6月的5G标准
  8. 传感器数据完善 AI 功能,激起机器人“网络效应”
  9. 5 个大厂 offer,该怎么选?
  10. 互联网人职业发展之路,你中招了吗?| 每日趣闻