IntRange.random()如何在Kotlin中引入熵

时间:2019-02-25 07:14:36

标签: random kotlin

我正计划使用IntRange.random()(即(0..9999).random())在科特林中生成随机的5位代码。重要的是,恶意人员不能预测将要生成的数字的顺序。

IntRange.random()是否确保生成这些数字时存在熵?也就是说,每次调用IntRange.random()时,种子是如何生成的?新种子是如何生成的?

谢谢!

1 个答案:

答案 0 :(得分:4)

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