Генерация случайных чисел в питоне - PullRequest
0 голосов
/ 12 октября 2018

Является ли это допустимым способом генерации n случайных байтов, которые являются криптографически случайными?

def cryptographically_secure_random_bytes(n):
    return ''.join(chr(random.SystemRandom().randint(0,256)) for _ in range(n))

Я знаю, random.SystemRandom() совпадает с os.urandom(), и я знаю, что os.urandom()безусловно, криптографически безопасный способ генерации случайных чисел.

Тем не менее, часть chr(random.SystemRandom().randint(0,256)) немного сбивает меня с толку.Поскольку chr() не поддерживает юникод, я предполагаю, что эта функция отбрасывает некоторые символы, которые в противном случае были бы созданы random.SystemRandom().

Я не уверен, что и думать о randint(0,256), так как это размер байта.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Используйте модуль secret!

Из документов:

Модуль secrets используется для генерации криптографически сильных случайных чисел, подходящих дляуправление данными, такими как пароли, аутентификация учетной записи, токены безопасности и связанные с ними секреты.

В частности, secret s следует использовать вместо генератора псевдослучайных чисел по умолчанию вrandom модуль, предназначенный для моделирования и симуляции, а не безопасности или криптографии.

0 голосов
/ 12 октября 2018

random.randint (a, b)

Возвращает случайное целое число N такое, что a <= N <= b.Псевдоним для рандранжа (a, b + 1). </p>

Таким образом, вы можете получить что-то большее, чем байт.

...