我正计划使用IntRange.random()
(即(0..9999).random()
)在 Kotlin 中生成一个随机的5位代码。重要的是,恶意人员不能预测将要生成的数字的顺序。IntRange.random()
是否确保生成这些数字时存在熵?也就是说,每次调用IntRange.random()
时,种子是如何生成的?是否生成了新种子?
谢谢!
最佳答案
Here,当您使用JDK时,可以找到Kotlin中使用的random的JDK平台特定实现。如您所见,该实现基于ThreadLocalRandom
,根据其文档,该密码在密码上并不安全:
Instances of `ThreadLocalRandom` are not cryptographically
secure. Consider instead using `java.security.SecureRandom` in
security-sensitive applications.
对于您的用例,可以考虑添加自定义安全随机生成器,如下所示:
fun IntRange.secureRandom() =
SecureRandom().apply {
nextBytes(ByteArray(20))
}.nextInt((endInclusive + 1) - start) + start
这可以在
Int
的范围内调用:(0..10).secureRandom()
在所示的实现中,您可以看到一遍又一遍地创建了
SecureRandom
,并且您可能需要考虑对其进行缓存。它正在自我播种(而不是显式播种)以改善熵。另外,您可以创建自己的
kotlin.random.Random
实例,然后将其传递给 IntRange::random(random: Random)
,这一次是使用重用的SecureRandom
实例:class SekureRandom : Random() {
private val secureRandom = SecureRandom().apply {
nextBytes(ByteArray(20))
}
override fun nextBits(bitCount: Int) =
secureRandom.nextInt(bitCount)
}
可以这样使用:
(0..10).random(SekureRandom())
注意:请例如找到有关改进此here的方法。
关于random - IntRange.random()如何在Kotlin中引入熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54861174/