簡體   English   中英

生成可預測的安全隨機數

[英]Generating Predictable Secure Random Numbers

如何實例化可預測且安全的隨機數生成器,該生成器將在Java版本和操作系統之間生成一致的隨機數?

以下代碼曾在Java 8中運行,但在Java 10中不再運行:

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中-好的,不同的隨機對象會生成相同的隨機數:

SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519

在Java 10中-糟糕,不同的隨機對象會生成不同的隨機數:

DRBG
SUN version 10
-3526685326322256981
-2373261409119309182

您想要做的就是使用SecureRandom.getInstance使用舊算法獲取安全隨機實例。

下面的示例代碼。 您應該考慮天氣,這不是您真正想要的行為。

    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());

    }

}

這吐出:

3325995872096263519
3325995872096263519

就像您在尋找一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM