当前位置:   article > 正文

java securerandom使用_SecureRandom的正确使用

java securerandom

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

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

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

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

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

Linux操作系统的/dev/random设备接口

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. 小结

SecureRandom的使用可以采用无参构造方法实例化,无需手动设置种子。

如果出现了熵源不足获取随机数阻塞的问题,再进一步优化即可。

不是安全场景的随机数,使用Random就好。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/413305
推荐阅读
相关标签
  

闽ICP备14008679号