Каков стандартный метод генерации одноразового номера в Python? - PullRequest
14 голосов
/ 08 апреля 2011

Может ли кто-нибудь поделиться лучшими практиками создания одноразовых номеров для запроса OAuth в Python?

Ответы [ 5 ]

9 голосов
/ 28 января 2015

Вот как python-oauth2 делает это:

def generate_nonce(length=8):
    """Generate pseudorandom number."""
    return ''.join([str(random.randint(0, 9)) for i in range(length)])

У них также есть:

@classmethod
def make_nonce(cls):
    """Generate pseudorandom number."""
    return str(random.randint(0, 100000000))

Кроме того, существует проблема под названием: "make_nonce не является достаточно случайным", что предполагает:

def gen_nonce(length):
   """ Generates a random string of bytes, base64 encoded """
   if length < 1:
      return ''
   string=base64.b64encode(os.urandom(length),altchars=b'-_')
   b64len=4*floor(length,3)
   if length%3 == 1:
      b64len+=2
   elif length%3 == 2:
      b64len+=3
   return string[0:b64len].decode()

, а также ссылки CVE-2013-4347 .TL; версия DR, используйте os.urandom или абстрагированный интерфейс к нему ( SystemRandom ).

Мне нравятся мои lambda s - и я не хотел, чтобы не алфавитно-цифровые символы - такЯ использовал это:

lambda length: filter(lambda s: s.isalpha(), b64encode(urandom(length * 2)))[:length]
6 голосов
/ 30 октября 2016

Nonce должен использоваться как только один раз и трудно предсказать :

import uuid

uuid.uuid4().hex
# '12b90b6ffc0e46f788a26f1a6dc246fc'

uuid4() использует os.urandom(), что является лучшей случайностью, которую вы можете получить в питоне.

Обратите внимание, что uuid4() сложнее предсказать, чем uuid1(), тогда как позже он более глобально уникален. Вы можете объединить два для достижения обеих целей:

uuid.uuid4().hex + uuid.uuid1().hex
# 'a6d68f4d81ec440fb3d5ef6416079305f7a44a0c9e9011e684e2c42c0319303d'
4 голосов
/ 29 марта 2013

Вот что делает rauth .Здесь не очень сложные и быстрые правила.Спецификация не кажется слишком самоуверенным.Ваши ограничения заключаются в том, что значение, являющееся nonce, должно быть уникальным.Кроме этого, при условии, что провайдер не жалуется, вы можете использовать любой метод, который вам нравится.

1 голос
/ 25 января 2019

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

В этом случае генерация одноразового номера может быть легко сгенерирована (здесь строка в кодировке base64):

nonce = secrets.token_urlsafe()

Возможны следующие варианты: token_bytes для получения двоичного токена или token_hex для получения шестнадцатеричной строки.

1 голос
/ 06 октября 2015

Вот несколько идей, которые я получил для электронной почты.Generate_nonce происходит из их кода, но я использую generate_nonce_timestamp, для которого я использовал uuid.Он дает мне случайную буквенно-цифровую строку и метку времени в секундах:

import random
import time
import uuid


def generate_nonce(length=8):
    """Generate pseudo-random number."""
    return ''.join([str(random.randint(0, 9)) for i in range(length)])


def generate_timestamp():
    """Get seconds since epoch (UTC)."""
    return str(int(time.time()))

def generate_nonce_timestamp():
    """Generate pseudo-random number and seconds since epoch (UTC)."""
    nonce = uuid.uuid1()
    oauth_timestamp, oauth_nonce = str(nonce.time), nonce.hex
    return oauth_nonce, oauth_timestamp

Мне нравится использовать uuid1, так как он генерирует uuid на основе текущего хоста и времени и имеет свойство времени, которое вы можете извлечьесли вам нужно оба.Для электронной почты вам понадобятся как временная метка, так и одноразовый номер.

Вот что вы получите:

>>> generate_nonce_timestamp()
('a89faa84-6c35-11e5-8a36-080027c336f0', '136634341422770820')

Если вы хотите удалить -, используйте nonce.get_hex().

uuid1 - Генерирует UUID из идентификатора хоста, порядкового номера и текущего времени.Подробнее о uuid .

...