gpt4 book ai didi

java - Java 1.8 版能否生成与 Java 1.6 版相同的 SecureRandom 值?

转载 作者:行者123 更新时间:2023-11-30 10:15:59 25 4
gpt4 key购买 nike

我在系统验证系统上遇到问题。我们的服务器使用的是1.6版本,而客户端使用的是1.8版本,在认证过程中,我们通过"SHA1PRNG"SecureRandom生成一个 key ,同时代码如下:即:

KeyGenerator keygen = KeyGenerator.getInstance("Blowfish"); 
SecureRandom foo = SecureRandom.getInstance("SHA1PRNG");
foo.setSeed("baa".getBytes());
keygen.init(foo);

问题是,我们发现客户端生成的 key 与服务器生成的 key 不同。我们已经把所有步骤都打印出来了,发现问题出在SecureRandom,即foo.setSeed("baa".getBytes());之后如果我们调用 foo.nextBytes(),它会给出不同的值。

因此,我们想知道有没有办法让双方产生相同的值(value)? (鉴于不能更改客户端和服务器中的 Java 版本。)或者 Java 中是否有任何平台独立的 SecureRandom 方法?

背景信息:SERVER 和 CLIENT 在 Unix 中运行。我有一个运行 Java 1.8 的桌面,我测试了以下内容:

  1. Desktop Java 1.8可以加解密CLIENT(Java 1.8)生成的 key

  2. CLIENT (Java 1.8) 无法加密或解密 SERVER (Java 1.6) 中生成的 key ,反之亦然。

  3. CLIENT 已安装Java 1.6 (仅供测试) 无法加密或解密SERVER (Java 1.6) 中生成的 key 。我们猜测是因为 /dev/random/dev/urandom 已经被 Java 1.8 版本覆盖了。因此,即使是相同的 Java 版本,它们也有不同的行为。

最佳答案

来自 the documentation for SecureRandom :

Additionally, SecureRandom must produce non-deterministic output. Therefore any seed material passed to a SecureRandom object must be unpredictable, and all SecureRandom output sequences must be cryptographically strong, as described in RFC 1750: Randomness Recommendations for Security.

因此,您不仅通过传递可预测的种子违反了 SecureRandom 的要求,而且还明确要求 SecureRandom 的输出不可预测.

为了生成可预测的随机序列,请使用 Random :

If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.

但要注意:如果你每次都使用相同的种子,那么数字将永远相同,所以你必须使用相同的初始种子,即以某种方式在客户端和服务器之间共享。每次重新启动服务器应用程序时都需要重置此初始种子。

Random 的实例必须在对例程的调用之间共享,否则每次都会生成相同的单个数字:

public static void main(final String[] args) {
IntStream.range(1, 10)
.map(i -> new Random(42).nextInt())
.forEach(System.out::println);
}

输出:

-1170105035
-1170105035
-1170105035
-1170105035
-1170105035
-1170105035
-1170105035
-1170105035
-1170105035

一般来说,您尝试做的是 Bad Idea TM。使用 an asymmertric encryption scheme 会更好而不是试图自己重新发明轮子。

关于java - Java 1.8 版能否生成与 Java 1.6 版相同的 SecureRandom 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50209640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com