首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成可预测安全随机数

生成可预测安全随机数
EN

Stack Overflow用户
提问于 2018-09-22 08:06:17
回答 1查看 863关注 0票数 2

我如何实例化一个可预测和安全的随机数生成器,它将在Java版本和操作系统之间生成一致的随机数?

以下代码过去在Java 8中工作,但在Java 10中不再起作用:

代码语言:javascript
复制
import java.security.SecureRandom;

public class PredictableRandom {

public static void main(String[] args) {
    PredictableRandom predictableRandom = new PredictableRandom();
    predictableRandom.execute();
}

private void execute() {
    SecureRandom secureRandom = new SecureRandom();
    System.out.println(secureRandom.getAlgorithm());
    System.out.println(secureRandom.getProvider());
    long seed = 12345678L;
    secureRandom.setSeed(seed);
    System.out.println(secureRandom.nextLong());
    SecureRandom secureRandom2 = new SecureRandom();
    secureRandom2.setSeed(seed);
    System.out.println(secureRandom2.nextLong());
}
}

在Java 8中,不同的随机对象生成相同的随机数:

代码语言:javascript
复制
SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519

在Java 10 - bad中,不同的随机对象生成不同的随机数:

代码语言:javascript
复制
DRBG
SUN version 10
-3526685326322256981
-2373261409119309182
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-22 09:15:03

您想要做的是使用使用SecureRandom.getInstance的旧算法获得安全随机的实例。

下面是示例代码。你应该考虑天气,这是你真正想要的行为。

代码语言:javascript
复制
    public void example() throws NoSuchAlgorithmException {
    {
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(12345678L);
        System.out.println(secureRandom.nextLong());

    }
    {
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(12345678L);
        System.out.println(secureRandom.nextLong());

    }

}

这句话的意思是:

代码语言:javascript
复制
3325995872096263519
3325995872096263519

就像你在找的一样。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52454736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档