SecureRandom编号中的算法

时间:2012-03-10 14:08:35

标签: java android servlets random

我在我的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();
}

2 个答案:

答案 0 :(得分:2)

SecureRandom的javadoc说:

  

许多SecureRandom实现采用伪随机的形式   数字生成器(PRNG),这意味着它们使用确定性   算法从真随机种子产生伪随机序列。   其他实现可能产生真正的随机数,还有其他实现   可以结合使用这两种技术。

也许算法使用另一个随机源来产生随机数。这样做不会破坏SecureRandom类的合同。它甚至会更满足它,因为安全随机生成器的目标是产生随机数,而不是可预测的数字序列。

答案 1 :(得分:0)

让我在4年后放2美分。

SecureRandom实际上是系统相关的,这意味着生成数据的方式是特定于操作系统的。操作系统本身提供了一个获取熵的接口(甚至可能就是你移动鼠标的方式)。这就是你得到不同结果的原因。