不,您应该避免使用
SecureRandom(byte[])构造函数。它既不安全又不可携带。
它是不可移植的,因为它在Windows和其他 *** 作系统上的行为有所不同。
在大多数 *** 作系统上,默认算法是“ NativePRNG”,该算法从 *** 作系统(通常是
"/dev/random")获取随机数据,而忽略您提供的种子。
在Windows上,默认算法为“ SHA1PRNG”,该算法将您的种子与计数器结合在一起,并计算结果的哈希值。
在您的示例中,这是个坏消息,因为输入(当前UTC时间(以毫秒为单位))具有相对较小的可能值范围。例如,如果攻击者知道RNG是在过去48小时内播种的,则他们可以将种子缩小到小于2
28个可能的值,即,您只有27位熵。
另一方面,如果您
SecureRandom()在Windows上使用了默认构造函数,则它将调用本机
CryptoGenRandom函数来获取128位种子。因此,通过指定您自己的种子,可以削弱安全性。
如果您确实想覆盖默认种子(例如,用于单元测试),则还应指定算法。例如
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");sr.setSeed("abcdefghijklmnop".getBytes("us-ascii"));
另请参阅如何使用Java SecureRandom解决性能问题?
和此博客文章:http : //www.cigital.com/justice-league-
blog/2009/08/14/proper-use-of-javas-
securerandom/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)