【问题标题】:Achieve more randomness through user input in Java通过 Java 中的用户输入实现更多随机性
【发布时间】:2013-12-02 22:42:56
【问题描述】:

我想在用 java 实现的密钥生成中实现更多随机性,因为密钥强度取决于它。

我想使用java.security.KeyPairGenerator 创建私钥和公钥。 可以使用SecureRandom 对象定义种子。

  SecureRandom random = new SecureRandom();
  byte[] rand = new byte[8]; // or only one byte

假设我创建random byte[] 如下:

// new KeyPress registered
long currentTime = System.currentTimeMillis();
long time = currentTime - lastTime;
lastTime = currentTime;
byte = time % Byte.MAX_VALUE;
// add byte to array or to the SecureRandom object
random.setSeed(byte);

initialize 方法允许将种子添加到生成器对象。这应该增加 键的随机性。

// adds the seed to the generator
keyGen.initialize(4096, random);

问题是我应该在所有用户输入之后还是在例如 8 个字节之后设置密钥生成器的种子? 我知道这里获得的随机性取决于系统时钟的精度。但我认为 currentTimeMillis() 方法是精确的。

你认为这是一个解决更多随机性的方法吗? 或者你认为这不会改变什么?

编辑 1 03.12.13 首先,感谢您的cmets和想法! @Quincunx“我会说 SecureRandom 可能足够随机。” 够了干什么?我的意思是我认为这取决于你需要它。正确的? 问题是我怎样才能增加随机性?! @IT-Pro 是的,我可以使用时间的平方,但我认为用户输入更随机,对吧? 你的意思是说在用户输入之后收集一个字节数组并在用户完成所有输入到生成器后将其传递?

编辑 2 03.12.13 @埃里克森 我觉得你说的不是真的! “这些系统级设备已经从按键收集熵” 你能分享一个链接吗? 你可能比我对这个话题有更多的了解,但是如果你这么说,我想阅读更多关于它的细节!

【问题讨论】:

标签: java random key random-seed


【解决方案1】:

这不是必需的。它不会损害您的安全性,但会损害代码的可读性和可信度。

SecureRandom 的提供者将为您播种生成器。 SUN 提供者和其他质量提供者将使用来自底层系统的熵源,例如 /dev/random 或 /dev/urandom;这些系统级设备已经从按键和其他难以预测的来源,甚至从真正随机的物理过程中收集熵。

所以,我建议你不要打扰。充其量,按键时间只会为您每次按键提供一两个熵,并且仅在系统源尚未包含该事件的情况下。

【讨论】:

    【解决方案2】:

    你总是可以取 currentTimeMillis()*currentTimeMillis() 的立方根

    这是一个相当随机的种子。

    是的。看来用户输入后才是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2013-09-03
      • 2015-01-12
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多