Java 安全随机数算法

Java 安全随机数算法,java,android,servlets,random,Java,Android,Servlets,Random,我在android客户端和服务器(Servlet)中得到一个随机数。我在客户端和服务器中使用相同的SecureRandom算法(“SHA1PRNG”)。我的种子值对两者都是一样的。但是我得到的输出数字在客户端和服务器上都是不同的。原因可能是什么?这是我的密码: SecureRandom random = new SecureRandom(); try { random.getInstance("SHA1PRNG"); } catch (Exception e) { // ...

我在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();
}
SecureRandom random=new SecureRandom();
试一试{
random.getInstance(“SHA1PRNG”);
}捕获(例外e){
// ...
}
;
随机设定种子(1097327);
字节[]b1=新字节[3];
随机。下一个字节(b1);
长值=0;
对于(int i=0;ivalue+=(b1[i]&0xff)SecureRandom的javadoc说:

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


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

让我在4年后投入2美分


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

我在Android中使用了安全randon数字生成器,并且使用了两次相同的种子实例,我得到了两次相同的随机数。当我在Servlets中进行相同操作时,我得到了两个相同种子的两个相等随机数。但问题是Android中的随机数不等于Servleth中的随机数Android平台上的e实现和servlet使用的JDK上的e实现可能略有不同。但我的观点仍然是:在不同的平台上,使用一个按照约定应该尽可能安全地随机生成数字的类,以获得可预测的数字序列,这不是一个好主意WN算法,通过合同,生成种子的可预测序列,或者在一个边上生成数字,并与另一方共享它们。好的。我会考虑。非常感谢。