java - 使用 Random 播种时 SecureRandom 会减弱吗?
问题描述
java.util.Random
来自for的种子会java.security.SecureRandom
削弱加密强大的随机数生成器吗?
我看到了这段代码,想知道为什么以这种特定方式完成。
randomGenerator = new SecureRandom();
final Random rnd = new Random();
randomGenerator.setSeed(rnd.nextLong());
从文档来看,调用setSeed
永远不会减少随机性。那为什么还要setSeed
调用呢?
public void setSeed(long seed)
使用给定长种子中包含的八个字节重新设置此随机对象的种子。给定的种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会减少随机性。
docs.oracle.com
解决方案
使用 CSPRNG 时,加密强度与用于播种它的熵的位强度相同。
CSPRNG 将产生几乎无限量的伪随机熵,尽管实际上该伪随机熵的实际强度仅与 CSPRNG 的潜在种子状态的熵一样强。
因此,如果您只使用您的种子,java.util.Random
就会有麻烦。
值得庆幸的是,内核和其他来源用于播种使用的系统 CSPRNG,java.security.SecureRandom
因此如上面的示例代码所示“添加”/混合到其中,不能使其“减少”随机性或减少熵。
所以:
- 是的,
java.util.Random
种子一文不值。 - 这没关系,因为系统已经从硬件中断、启动抖动和其他噪声中植入 CSPRNG。
- 写这个的人:
randomGenerator.setSeed(rnd.nextLong());
不应该参与密码工程。
推荐阅读
- mysql - MySQL A 或 B 但不是两者
- php - 是什么让数组变量改变了它的值,即使它是由 val 分配的,而不是引用
- sql - Clickhouse:如何将日期转换为长整数?
- c# - Nancy 模型绑定到子类。自动检测?
- node.js - moongoose js Schema不是构造函数和函数错误
- react-native - 没有键的减速器(反应原生)
- r - 展开包含 CSV 值的 R 数据框结构
- excel - 每个语句和 if 语句使用 2 个条件的范围
- java - 如何使用 Java 8 流使用集合流式传输地图?
- javascript - 包装 HOC 时访问 react-navigation 道具(绑定 this)?