[英]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.