我需要/想要随机(好吧,不完全是)数字来生成密码。
我做什么:目前我正在用 SecureRandom 生成它们.
我正在获取对象
SecureRandom sec = SecureRandom.getInstance("SHA1PRNG", "SUN");
然后像这样播种
sec.setSeed(seed);
目标:一种(最好是快速的)创建随机数的方法,它在密码学上至少像 SHA1PRNG SecureRandom 实现一样安全。这些在不同版本的 JRE 和 Android 上必须相同。
编辑:种子是根据用户输入生成的。
问题:SecureRandom.getInstance("SHA1PRNG", "SUN");
失败如下:
java.security.NoSuchProviderException:太阳
。省略 ,“SUN”
会生成随机数,但它们与默认 (JRE 7) 数字不同。
问题:我怎样才能实现我的目标?
您不希望它是可预测的:我想要,因为我需要可预测性以便相同的前提条件产生相同的输出。如果它们不相同,则不可能 很难执行用户对应用程序的期望。
编辑:我所说的可预测是指,当知道一个字节(或一百个)时,你不应该能够预测下一个,但是当你知道种子时,你应该能够预测第一个(以及所有其他字节) ).也许另一个词是可重现。
如果有人知道更直观的方法,请告诉我!
最佳答案
我最终将 Sha1Prng 从 sun 源中分离出来,这保证了在所有版本的 Java 和 android 上的再现性。我需要删除一些重要的方法以确保与 android 的兼容性,因为 android 无法访问 nio 类...
关于java - 跨版本和平台的一致随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906336/