Каков наилучший способ создания токена сброса в python?

Я пытаюсь сделать процесс проверки для сброса пароля, то, что я использовал, - это два значения: время эпохи, и я хочу использовать старый пароль пользователей (pbkdf2) в качестве ключа,

Поскольку я не хочу получать символы без символов ASCII, я использовал библиотеку SimpleEncode, потому что это быстро, поскольку это только BASE64 с используемым ключом, но проблема в том, что пароль слишком длинный (196 символов), поэтому я получаю длинный ключ!

То, что я сделал, разбивает code = simpleencode.encode(key,asci)[::30] результата code = simpleencode.encode(key,asci)[::30], но это не будет уникальным!

Чтобы понять, как это работает, я пробовал процесс сброса в Facebook, но то, что дается, - это число! так как этот процесс работает, разве они не используют ключ, чтобы затруднить кому-то создать ссылку для сброса пароля?

Обновление: как будет работать алгоритм:

1- получить время, используя epoche time.time()

2- генерируют Base64 времени эпохи (для использования для URL-адреса) и значение времени эпохи + ключ, этот ключ - PBKDF2 (пароль).

3- сгенерируйте URL-адрес www.example.com/reset/user/Base64 (time.time()) и отправьте этот URL + simpleencode.encode(key,asci)[::30]

4-, когда пользователь нажимает на URL-адрес, он ставит сгенерированный код, этот сгенерированный код, если он совпадает с URL-адресом, а затем пусть он модифицирует пароль, иначе это URL-адрес для забывания!

Ответ 1

Не уверен, что это лучший способ, но я бы, скорее всего, сгенерировал UUID4, который можно использовать в URL-адресе для сброса пароля и истечения его после "n" количества времени.

>>> import uuid
>>> uuid.uuid4().hex
'8c05904f0051419283d1024fc5ce1a59'

Вы можете использовать что-то вроде http://redis.io для хранения этого ключа со значением соответствующего идентификатора пользователя и установить время для его жизни. Итак, когда что-то приходит с http://example.com/password-reset/8c05904f0051419283d1024fc5ce1a59, он смотрит, действительно ли он действителен, и если да, то позволяет изменениям устанавливать новый пароль.

Если вам нужен "валидационный валид", то сохраните вместе с токеном небольшой случайный ключ, например:

>>> from string import digits
>>> from random import choice
>>> ''.join(choice(digits) for i in xrange(4))
'2545'

И запрос, который будет введен на ссылку сброса.

Ответ 2

Самый простой способ - использовать библиотеку ItsDangerous:

Вы можете сериализовать и подписать идентификатор пользователя для отмены подписки на информационные бюллетени в URL-адресах. Таким образом, вам не нужно создавать одноразовые токены и хранить их в базе данных. То же самое с любой ссылкой активации для аккаунтов и подобных вещей.

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

>>> from itsdangerous import TimestampSigner
>>> s = TimestampSigner('secret-key')
>>> string = s.sign('foo')
>>> s.unsign(string, max_age=5)
Traceback (most recent call last):
  ...
itsdangerous.SignatureExpired: Signature age 15 > 5 seconds