Уникальный идентификатор сеанса в python

Как создать уникальный идентификатор сеанса в Python?

Ответ 1

Вы можете использовать uuid library так:

import uuid
my_id = uuid.uuid1() # or uuid.uuid4()

Ответ 2

ОБНОВЛЕНИЕ: 2016-12-21

Много произошло за последние ~ 5 лет. /dev/urandom был обновлен и теперь считается источником высокой энтропии случайности в современных ядрах и дистрибутивах Linux. В последние 6 месяцев мы наблюдали энтропийное голодание в ядре Linux 3.19 с использованием Ubuntu, поэтому я не думаю, что эта проблема "решена", но достаточно сложно получить низкоэнтропийную случайность при запросе любого количества случайности из ОС.


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

# pip install M2Crypto
import base64, M2Crypto
def generate_session_id(num_bytes = 16):
    return base64.b64encode(M2Crypto.m2.rand_bytes(num_bytes))

Ни uuid() ни os.urandom() являются хорошим выбором для генерации идентификаторов сеансов. Оба могут генерировать случайные результаты, но случайные не означают, что они безопасны из-за плохой энтропии. См. " Как взломать линейный конгруэнтный генератор " ресурсами Haldir или NIST по генерации случайных чисел. Если вы все еще хотите использовать UUID, используйте UUID, который был сгенерирован с хорошим начальным случайным числом:

import uuid, M2Crypto
uuid.UUID(bytes = M2Crypto.m2.rand_bytes(num_bytes)))
# UUID('5e85edc4-7078-d214-e773-f8caae16fe6c')

или же:

# pip install pyOpenSSL
import uuid, OpenSSL
uuid.UUID(bytes = OpenSSL.rand.bytes(16))
# UUID('c9bf635f-b0cc-d278-a2c5-01eaae654461')

M2Crypto - лучший API OpenSSL в Python atm, так как pyOpenSSL поддерживается только для поддержки устаревших приложений.

Ответ 3

import os, base64
def generate_session():
    return base64.b64encode(os.urandom(16))

Ответ 4

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

Ответ 5

Для чего нужен сеанс? Веб-приложение? Возможно, вы захотите посмотреть модуль стакана. Это модуль по умолчанию для обработки сеансов в Pylons.

Ответ 6

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

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

https://docs.python.org/3/library/secrets.html

Пример:

import secrets

def make_token():
    """
    Creates a cryptographically-secure, URL-safe string
    """
    return secrets.token_urlsafe(16)  

В использовании:

>>> make_token()
'B31YOaQpb8Hxnxv1DXG6nA'