Как IntRange.random () вводит энтропию в Kotlin - PullRequest
0 голосов
/ 25 февраля 2019

Я планирую использовать IntRange.random() (то есть (0..9999).random()) для генерации случайного 5-значного кода в Kotlin .Важно, чтобы злоумышленники не могли предсказать последовательность чисел, которые будут сгенерированы.

Обеспечивает ли IntRange.random() наличие энтропии при генерации этих чисел?т.е. как генерируется начальное число и генерируется ли новое семя каждый раз, когда вызывается IntRange.random()?

Спасибо!

1 Ответ

0 голосов
/ 25 февраля 2019

Здесь вы можете найти специфичную для 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())

ПРИМЕЧАНИЕ: Пожалуйста, узнайте о способах еще более улучшить это здесь например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...