我想在用 Java 实现的 key 生成中实现更多随机性,因为 key 强度取决于它。
我想使用 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 方法允许将种子添加到生成器对象。这应该增加 key 的随机性。
// adds the seed to the generator
keyGen.initialize(4096, random);
问题是我应该在所有用户输入之后还是在例如 8 个字节之后设置 key 生成器的种子? 我知道这里获得的随机性取决于系统时钟的精度。但我假设 currentTimeMillis() 方法是精确的。
您认为这是一种增加随机性的解决方案吗? 还是您认为这不会改变任何事情?
编辑 1 03.12.13 首先,感谢您的意见和想法! @Quincunx “我会说 SecureRandom 可能足够随机。” 够什么?我的意思是我认为这取决于你需要它做什么。正确的? 问题是我怎样才能增加随机性?! @IT-Pro 是的,我可以使用时间的平方,但我认为用户输入更随机,对吧? 您的意思是说在用户输入后收集字节数组并在用户完成对生成器的所有输入后将其传递吗?
编辑 2 03.12.13 @埃里克森 我觉得你说的不对! “这些系统级设备已经从按键中收集熵” 你能分享一个链接吗? 你可能比我对这个话题有更多的理解,但是,如果你这样说,我想阅读更多关于它的细节!
最佳答案
这不是必需的。它不会损害您的安全,但会损害代码的可读性和可信度。
SecureRandom
的提供者将为您播种生成器。 SUN
提供者和其他质量提供者将使用来自底层系统的熵源,例如/dev/random 或/dev/urandom;这些系统级设备已经从按键和其他不可预测的来源,甚至是真正随机的物理过程中收集熵。
所以,我建议你不要打扰。充其量,按键计时只会给你每次按键的一两个熵,而且只有在系统源尚未包含该事件的情况下才会如此。
关于java - 通过 Java 中的用户输入实现更多的随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339388/