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

标签 random kotlin

我正计划使用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/

相关文章:

android - 如何解决由 : java. nio.file.NoSuchFileException : app/build/intermediates/external_libs_dex/release/out while signing apk? 引起的问题

android - 使 String 之类的类可打包?

android - 如何在 RxJava 2 和 Kotlin 中将 null 传递给具有可空类型的 Observable

c++ - uniform_real_distribution() 的最小值

python - 从较小的原始列表中返回 N 个随机项目

java - 二维数组

java - 随机数未打印出来

android - 从正确的线程调用 RxJava2 可取消/一次性

android - 协程解释

c - 为什么我总是用 rand() 得到相同的随机数序列?