我在系统身份验证系统上遇到问题。"SHA1PRNG"
我们的服务器使用的是1.6版本,客户端使用的是1.8版本,在认证过程中,我们通过with生成密钥SecureRandom
,代码如下:即:
KeyGenerator keygen = KeyGenerator.getInstance("Blowfish");
SecureRandom foo = SecureRandom.getInstance("SHA1PRNG");
foo.setSeed("baa".getBytes());
keygen.init(foo);
问题是,我们发现客户端生成的密钥与服务器生成的密钥不同。我们累了打印出所有步骤,发现问题是由 引起的SecureRandom
,即foo.setSeed("baa".getBytes());
如果我们调用后foo.nextBytes()
,它会给出不同的值。
因此,我们想知道是否有什么方法可以保持双方产生相同的值?(鉴于客户端和服务器中的 Java 版本都不能更改。)或者SecureRandom
Java 中是否有任何独立于平台的方法?
背景信息: SERVER 和 CLIENT 在 Unix 中运行。我有一个运行 Java 1.8 的桌面,并且我测试了以下内容:
Desktop Java 1.8 可以加密和解密 CLIENT (Java 1.8) 中生成的密钥
CLIENT (Java 1.8) 不能加密或解密 SERVER (Java 1.6) 中生成的密钥,反之亦然。
CLIENT 已安装 Java 1.6(仅用于测试)无法加密或解密在 SERVER(Java 1.6)中生成的密钥。我们猜测是因为
/dev/random
或/dev/urandom
已被覆盖到 Java 1.8 版本。因此,即使 Java 的版本相同,它们也有不同的行为。