- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
尽管在阅读了很多关于 SecureRandom
的文章之后,我还是对 Java 中 SecureRandom
安全 API 的使用产生了疑问。在下面的示例中。
public class SecureRandomNumber {
public static void main(String[] args) throws NoSuchAlgorithmException {
TreeSet<Integer> secure = new TreeSet<Integer>();
TreeSet<Integer> unSecure = new TreeSet<Integer>();
SecureRandom sr = new SecureRandom();
byte[] sbuf = sr.generateSeed(8);
ByteBuffer bb = ByteBuffer.wrap(sbuf);
long d = bb.getLong();
sr.setSeed(d);
Random r = new Random();
r.setSeed(System.nanoTime());
for (int k = 0; k < 99999; k++) {
int i = sr.nextInt();
if (!secure.add(i)) {
System.out.println("Repeated Secure Random Number");
} else {
// System.out.println("************Unique***********");
}
int j = r.nextInt();
if (!unSecure.add(j)) {
System.out.println("Repeated UnSecure Random Number");
}
}
}
当我运行这个程序时,我没有发现使用 SecureRandom
有任何额外的好处,因为它几乎给出了相同的结果。
谁能告诉我我在这里做的事情是否正确?
最佳答案
您普遍对随机数有一个普遍的误解:随机序列并不意味着该序列中的数字不能重复。恰恰相反,它很有可能会。这种误解实际上是用来分辨人类生成的“随机”序列与真实序列的区别。由人类生成的 0 和 1 的“随机”序列可能如下所示:
0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, ....
虽然一个真正的随机序列并不羞于重复相同的数字两次以上 :) 一个很好的例子是 statistical tests也寻找重复。
还有一种常见的误解是,加密安全的随机数会以某种方式产生“随机得多”的值。它们的统计概率可能非常相似,并且在那些标准统计测试中都表现得非常好。
因此,您的选择是 PRNG 还是加密安全 PRNG (CSPRNG),实际上取决于您想做什么。 “普通”PRNG 非常适合用于模拟目的,例如蒙特卡洛方法等。CSPRNG 的额外好处是不可预测性。因为 CSPRNG 可以“做更多”,所以它的性能也很可能比普通 PRNG 差。
可以证明,“安全”PRNG 的概念与预测其输出的下一位的能力紧密相关。对于 CSPRNG,随时预测其输出的下一位在计算上是不可行的。当然,这只有在您将其种子值视为 secret 时才成立。一旦有人找到了种子,整个事情就变得很容易预测了——只需重新计算 CSPRNG 算法已经生成的值,然后计算下一个值。可以进一步表明,不受“下一位预测”的影响实际上意味着没有任何统计测试可以区分 CSPRNG 的分布与真实随机均匀分布的分布。因此,PRNG 和 CSPRNG 之间还有另一个区别:虽然一个好的 PRNG 在许多统计测试中表现良好,但 CSPRNG 保证在所有测试中表现良好。
什么地方用哪个的经验法则就是那个
关于java - SecureRandom 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099241/
我想咨询一些关于 Java 中 SecureRandom 的常见神话、安全与性能权衡的问题。 在网上查了一段时间,整理了以下资料。我希望这里的人能帮助我确认我得到了什么,并希望对实际选择实现的内容有一
我正在尝试使用 SecureRandom 生成随机值,特别是它对流的支持。理想情况下,值应该在恒定的基础上生成,因此流可以是无限的: SecureRandom secureRandom = new S
我想知道 Docker 容器中的随机(或伪随机)序列生成,但遇到了另一个有趣的行为。 直接从 /dev/urandom 读取 8000000 字节并使用 ENT 测试结果时给出以下内容: Entrop
我需要生成加密的安全、随机和唯一字符串,每个字符串都将用作实际上是访问 token 。为此,我计划使用 Java 的 SecureRandom 类。但是,我不确定 SecureRandom 能否保证唯
我有一个使用 SHA1PRNG 的 SecureRandom 生成器: SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG"); 让我们假设这个
我在我的安卓客户端和服务器(Servlet)中得到了一个随机数。我在客户端和服务器中使用相同的 SecureRandom 算法(“SHA1PRNG”)。两者的种子值相同。但是我得到的输出数字在客户端和
我有一个需要加盐密码的应用程序。为了生成盐,我决定使用 SecureRandom。当我在我的 Windows 机器上时,一切都很好。然后我尝试在基于 Linux 的机器 (Centos 5) 上运行我
这是生成密码盐的正确方法吗? SecureRandom random = new SecureRandom(); byte[] salt = random.genera
我正在尝试按照以下方式打乱整数数组, 来自http://en.wikipedia.org/wiki/Fisher-Yates_shuffle , “当 Fisher–Yates shuffle 与伪随
在调查为什么我的 Ubuntu 15 上的 tomcat 8 服务器在启动时没有响应时,事实证明它花费了大量时间来尝试创建 SecureRandom 的实例。为什么会这样以及如何解决? May 19,
我们有一个生成随机临时密码的业务需求。根据用例,此类调用的数量预计非常低(约 400 个调用/天)。根据互联网上的各种建议以及阅读了许多关于 SO 的类似帖子后,我们决定使用 java.securit
尽管在阅读了很多关于 SecureRandom 的文章之后,我还是对 Java 中 SecureRandom 安全 API 的使用产生了疑问。在下面的示例中。 public class SecureR
我找到了很多关于 SecureRandom 的例子看起来像这样的类: Random random = new SecureRandom(); int randomInteger = random.ne
假设你做简单的事情: public class Main { public static void main(String[] args) { long started = S
SecureRandom 线程安全吗?也就是初始化之后,能否依赖对下一个随机数的访问是线程安全的?检查源代码似乎表明它是,this bug report似乎表明它缺乏作为线程安全的文档是一个 java
我正在尝试使用 SecureRandom 在我的 java 项目中生成随机数。但是对于如何为 SecureRandom 保留我的对象,我有点困惑。它应该是一个 static 类成员。我不打算从外面打电
我有一个使用 SecureRandom 实例并获取下一个随机数的类。 让我们说这个例子是: public class ExampleClass() { public void method()
关于SecureRandom,我有些不明白。以这里的代码为例: import java.security.SecureRandom; import java.math.BigInteger; publ
来自 java.util.Random 的 java.security.SecureRandom 种子是否会削弱加密强随机数生成器? 我看到这段代码,想知道为什么要以这种特定的方式完成。 random
在我的群组实体中,我生成一个随 secret 钥,用作“共享代码”:人们可以使用此代码邀请并找到彼此。以下是我的使用方法: public function __construct() { //
我是一名优秀的程序员,十分优秀!