【发布时间】: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 @埃里克森 我觉得你说的不是真的! “这些系统级设备已经从按键收集熵” 你能分享一个链接吗? 你可能比我对这个话题有更多的了解,但是如果你这么说,我想阅读更多关于它的细节!
【问题讨论】:
-
我会说
SecureRandom可能足够随机。如果有一种简单的方法可以让它更随机,为什么不在课堂上实现呢? -
docs.oracle.com/javase/6/docs/api/java/security/… 说得很清楚,它生成的随机数足以用于密码学。
-
这里有更多关于SecureRandom的阅读
标签: java random key random-seed