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

问题描述 投票:1回答:1

我打算使用IntRange.random()(即(0..9999).random())在Kotlin中生成一个随机的5位数代码。恶意人员无法预测将生成的数字序列非常重要。

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

谢谢!

random kotlin
1个回答
4
投票

Here你可以在JDK上找到Kotlin中随机使用的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的方法。

© www.soinside.com 2019 - 2024. All rights reserved.