通过Java中的用户输入实现更多随机性

时间:2013-12-02 22:42:56

标签: java random key random-seed

我希望在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 首先,感谢您的意见和想法! @Quincunx“我会说SecureRandom可能是随机的。” 够了什么?我的意思是我认为这取决于你需要它。对? 问题是我怎么能增加随机性?! @ IT-Pro是的,我可以使用时间的平方,但我认为用户输入更随机,对吧? 你的意思是说在用户输入之后收集一个字节数组并在用户完成所有输入到生成器之后传递它?

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

2 个答案:

答案 0 :(得分:3)

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

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

所以,我建议你不要打扰。最好的情况是,按键时间仅为每次按键提供一些或两个熵,并且仅当系统源尚未包含该事件时才会这样。

答案 1 :(得分:0)

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

这是一个非常随机的种子。

是的。用户输入后似乎是最好的解决方案。