random.choice, не случайный

вот библиотека и несколько примеров http://www.c-sharpcorner.com/UploadFile/malcolmcrowe/SnmpLib11232005011613AM/SnmpLib.aspx

13
задан Martin v. Löwis 2 September 2009 в 07:01
поделиться

5 ответов

Он не должен генерировать дубликаты.

import random
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def gen():
    return ''.join([random.choice(chars) for x in range(32)])

test = [gen() for i in range(100000)]
print len(test), len(set(test)) # 100000 100000

Вероятность дублирования значительна с chars = "ab"; 126 дубликатов за 1000000 итераций. Его нет в 62.

Тем не менее, это не лучший способ создания файлов cookie, потому что файлы cookie сеанса должны быть непредсказуемыми, чтобы избежать атак, связанных с кражей файлов cookie сеанса других людей. Mersenne Twister не предназначен для генерации безопасных случайных чисел. Вот что я делаю:

import os, hashlib
def gen():
    return hashlib.sha1(os.urandom(512)).hexdigest()

test = [gen() for i in range(100000)]
print len(test), len(set(test))

... который должен быть очень безопасным (то есть, трудно взять строку файлов cookie сеанса и угадать из них другие существующие файлы cookie сеанса).

12
ответ дан 2 December 2019 в 00:46
поделиться
  1. Я не знаю, как создаются ваши процессы FCGI, но возможно ли, что он использует fork () после запуска интерпретатора Python (и случайный модуль был импортирован чем-то) , следовательно, эффективное заполнение random._inst двух процессов из одного и того же источника?

  2. Может быть, внести некоторую отладку, чтобы убедиться, что он правильно загружается из urandom и не возвращается к менее строгому времени - на основе семян?

этот комментарий: человек! Тогда это меня озадачило; если RNG всегда имеет другое состояние при запуске, я не могу понять, как вы могли бы получить коллизии. Странно. Я полагаю, что для расследования конкретных случаев, которые приводят к столкновениям, пришлось бы добавить много журналов состояний, что звучит как большая работа по просмотру журналов. Может быть (1a) сервер FCGI обычно не

1
ответ дан 2 December 2019 в 00:46
поделиться

Мне пришлось стереть свой исходный ответ, в котором говорилось, что генератор не засевается из / dev / urandom , поскольку его источник (для Python 3 .x) ясно говорит, что это так:

def seed(self, a=None):
    """Initialize internal state from hashable object.

    None or no argument seeds from current time or from an operating
    system specific randomness source if available.

    If a is not None or an int or long, hash(a) is used instead.
    """

    if a is None:
        try:
            a = int(_hexlify(_urandom(16)), 16)
        except NotImplementedError:
            import time
            a = int(time.time() * 256) # use fractional seconds

    super().seed(a)
    self.gauss_next = None

Поэтому я смиренно принимаю, что в мире есть тайны, которые я, возможно, не смогу разгадать.

0
ответ дан 2 December 2019 в 00:46
поделиться

Чтобы избежать проблемы, вы можете использовать последовательность файлов cookie, которые гарантированно будут отличаться (например, вы можете использовать набор). Каждый раз, когда вы даете кому-то файл cookie, вы берете его из последовательности и добавляете к нему еще один. Другой вариант - сгенерировать UUID и использовать его в качестве файла cookie.

Другой способ избежать проблемы может заключаться в хранении закрытого ключа и использовании контрольной суммы закрытого ключа (например, MD5) со значением счетчика, присоединенным к Это. Тогда вероятность столкновения будет очень низкой. Для большей безопасности добавьте к контрольной сумме еще несколько переменных, таких как текущее время, IP-адрес пользователя, ...

Существуют библиотеки для создания файлов cookie. Любая реализация WSGI, вероятно, содержит генератор файлов cookie.

Если вас интересует только то, насколько случайны ваши строки, вы можете сгенерировать файл, скажем, с одним миллионом файлов cookie и выполнить проверку случайности в этом файле. Однако это не то, что я бы рекомендовал.

-4
ответ дан 2 December 2019 в 00:46
поделиться

Это определенно не обычный сценарий коллизии:

  • 32 символа с 62 параметрами на символ эквивалентны 190 битам (log2 (62) * 32)
  • Согласно парадоксу дня рождения , вы должны получать конфликт естественным образом один раз каждые 2 ** 95 файлов cookie, что означает никогда.

Может ли это быть проблемой параллелизма?

  • Если да, используйте разные экземпляры random.Random для каждого потока
  • Может сохранять эти экземпляры в локальном хранилище потока ( threading.local () )
  • В Linux Python должен засеять их, используя os.urandom () - не систему time - поэтому вы должны получить разные потоки для каждого потока.
4
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: