в чем разница между uuid4 и секретами token_bytes в python? - PullRequest
0 голосов
/ 06 мая 2020

Проверил исходный код cpython для секретов и uuid4 . Кажется, оба используют os.urandom.

#uuid.py
def uuid4():
    """Generate a random UUID."""
    return UUID(bytes=os.urandom(16), version=4)

#secrets.py
def token_bytes(nbytes=None):
    """Return a random byte string containing *nbytes* bytes.
    If *nbytes* is ``None`` or not supplied, a reasonable
    default is used.
    >>> token_bytes(16)  #doctest:+SKIP
    b'\\xebr\\x17D*t\\xae\\xd4\\xe3S\\xb6\\xe2\\xebP1\\x8b'
    """
    if nbytes is None:
        nbytes = DEFAULT_ENTROPY
    return _sysrand.randbytes(nbytes)

# This is code for randbytes in SystemRandom in random
 def randbytes(self, n):
        """Generate n random bytes."""
        # os.urandom(n) fails with ValueError for n < 0
        # and returns an empty bytes string for n == 0.
        return _urandom(n)

IETF предупреждает не использовать uuid для обеспечения безопасности. См. Раздел 6 UUID . Там написано

Соображения безопасности

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

Если секреты действительно используют urandom так же, как uuid4, можем ли мы использовать uuid4 вместо секретов. В чем вся цель использования секретов token_bytes вместо самого uuid4 ?. В соответствии со стандартами IETF модуль секретов для ключей / токенов API действительно небезопасен?

1 Ответ

1 голос
/ 06 мая 2020

Вы можете быть удивлены, узнав, что случайные UUID не являются полностью случайными. Чтобы быть точным, есть 6 битов, установленных для определения c значений ( указывает , что это случайный UID). Они созданы, чтобы быть уникальными (с высокой степенью достоверности). UUID имеют определенное c назначение, поэтому вы найдете все виды методов, определенных для них.

Более того, как следует из названия, они не означают, что являются секретами. Это также может означать, что возможные меры защиты, касающиеся секретов, не принимаются. Например, строки обычно легко найти в памяти, а UUID часто используются / передаются в текстовом представлении.

Токен - это нечто иное. Обычно он зашифрован и хранится в секрете. Таким образом, он служит другой цели. Конечно, и UUID, и токены могут состоять из случайных битов и байтов. Однако это больше касается использования правильного инструмента для работы.

Если вы создаете секретный ключ, а не токен или UUID, я бы предпочел метод c для генерации ключей API. В противном случае было бы неплохо использовать SystemRandom напрямую, потому что ключ не является ни UUID, ни токеном.

...