我想在一个很大的范围内生成一个随机的、加密安全的 double 值,比如 -Double.MAX_VALUE
至 Double.MAX_VALUE
。
根据现有的 StackOverflow 问题 ( 1 2 3 4 5 6 ),您可能会认为使用 min + new SecureRandom().nextDouble() * range
就足够了,但是 Double.MAX_VALUE - -Double.MAX_VALUE
溢出并变得无限!
为了解决这个问题,this StackOverflow answer建议使用 ThreadLocalRandom.nextDouble(min, max)
。虽然此方法确实能够跨越我需要的范围,但此实现在加密上并不安全!
如何安全地生成这么大范围内的随机数?
最佳答案
我认为这是不可能的。密码安全性的要求之一是这些数字应该与随机统一选择的值无法区分。
如果您选择 -10308 到 +10308 范围内的 264 个数字,则两个相邻的数字将用相当大的距离2.0E+308/2**64,大约是1.08E+289。
由于 double 有 53 位有效数,因此大多数数字无论如何都无法区分。例如,在使用 double 算术时,将 1.08E+289 添加到 1.0E+307 绝对没有效果。
即使您确实找到了一种将 264 值映射到此范围的方法,您可能仍然容易受到 birthday attacks 的影响。 。一般来说,您至少需要 80 位才能提供有用的保护级别。
关于java - 生成无溢出的安全随机 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45173256/