算法在SecureRandom号码
问题描述:
我在我的android客户端以及服务器(Servlet)中得到一个随机数。我在客户端和服务器端都使用相同的SecureRandom算法(“SHA1PRNG”)。我的种子价值都相同。但是我得到的输出数字在客户端和服务器端都是不同的。这可能是什么原因呢?这里是我的代码:算法在SecureRandom号码
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的javadoc中说:
许多SecureRandom实现是伪随机 数生成器(PRNG)的形式,这意味着它们将使用确定 算法来从真随机种子产生伪随机序列。其他实现可以产生真随机数,而其他实现可以使用两种技术的组合。
也许该算法使用另一个随机数来产生其随机数。这样做不会破坏SecureRandom类的合同。它甚至可以满足它,因为安全随机生成器的目标是生成随机数,而不是可预测的数字序列。
答
让我在4年后投入2美分。
SecureRandom
实际上是依赖于系统的,这意味着生成数据的方式是特定于操作系统的。操作系统本身提供了一个接口来获得熵(它可能甚至是你刚刚移动鼠标的方式)。这就是你得到不同结果的原因。
我在Android中使用了安全的randon数生成器,并使用相同的种子实例两次,我得到了相同的随机数两次。当我在Servlet中做同样的事情时,我得到了两个相同的随机数字,用于两个相同的种子。但问题是随机数** Android不等于servlet中的随机数** – suraj 2012-03-12 04:52:40
在Android平台和您的servlet使用的JDK上的实现可能略有不同。但我的观点仍然是:使用一个类,通过契约,应该尽可能安全地生成数字,以便在几个不同的平台上获得可预测的数字序列,这不是一个好主意。尝试使用自己的算法,通过契约,生成一个给定种子的可预测序列,或者在一侧生成数字,并与另一侧分享它们。 – 2012-03-12 08:02:37
好的。我会考虑它。非常感谢。你真棒 – suraj 2012-03-12 08:34:27