我在我的Android客户端以及服务器(Servlet)中得到一个随机数。我在客户端和服务器中使用相同的SecureRandom算法(“SHA1PRNG”)。我的种子价值对两者都是一样的。但是我得到的输出数量在客户端和服务器上都不同。可能是什么原因呢?这是我的代码:
SecureRandom random = new SecureRandom();
try {
random.getInstance("SHA1PRNG");
} catch (Exception e) {
// ...
}
;
random.setSeed(1097327);
byte[] b1 = new byte[3];
random.nextBytes(b1);
long value = 0;
for (int i = 0; i < b1.length; i++) {
value += (b1[i] & 0xff) << (8 * i);
Toast.makeText(getApplicationContext(), Long.toString(value),
Toast.LENGTH_LONG).show();
}
答案 0 :(得分:2)
SecureRandom的javadoc说:
许多SecureRandom实现采用伪随机的形式 数字生成器(PRNG),这意味着它们使用确定性 算法从真随机种子产生伪随机序列。 其他实现可能产生真正的随机数,还有其他实现 可以结合使用这两种技术。
也许算法使用另一个随机源来产生随机数。这样做不会破坏SecureRandom类的合同。它甚至会更满足它,因为安全随机生成器的目标是产生随机数,而不是可预测的数字序列。
答案 1 :(得分:0)
让我在4年后放2美分。
SecureRandom
实际上是系统相关的,这意味着生成数据的方式是特定于操作系统的。操作系统本身提供了一个获取熵的接口(甚至可能就是你移动鼠标的方式)。这就是你得到不同结果的原因。