Здесь вы можете найти специфичную для 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())
ПРИМЕЧАНИЕ: Пожалуйста, узнайте о способах еще более улучшить это здесь например.