我正在创建Android应用,该应用将生成安全随机的256位密钥。我还希望用户可以选择通过在屏幕上点击/拖动来生成随机字节,从而为随机数生成器提供种子(类似于TrueCrypt生成其键的方式)。看来SecureRandom
是我最好的选择,但是我在理解setSeed(byte[])
方法时遇到了麻烦。
这里是文档:
播种此随机对象。给定的种子补充而不是替换现有的种子。因此,保证重复呼叫永远不会降低随机性。
我打算获取用户触摸事件的X和Y坐标并对其进行哈希处理,然后将哈希中的字节重复地馈送到setSeed
中。
我的问题是,后续对setSeed
的调用会增强现有的“随机性”还是会或多或少地无用?还是有一种更好的方法来实现我完全不了解的目标?
最佳答案
是的,“或多或少没用”。
从docs:
“传递给SecureRandom对象的任何种子材料都必须不可预测”,鼠标移动可能不符合该标准。
通常,CPRNG会不断从设备上的事件中添加种子,您将做得更好。
也来自docs:
void setSeed (long seed)
使用给定长种子中包含的八个字节来重新设置此随机对象的种子。给定的种子补充而不是替换现有的种子。因此,保证重复呼叫永远不会降低随机性。
因此,继续前进,您将不会受到伤害,但是如果您有所改进,则值得怀疑。