python中的唯一会话ID

时间:2009-05-03 20:11:03

标签: python session

如何在Python中生成唯一的会话ID?

5 个答案:

答案 0 :(得分:75)

更新时间:2016-12-21

在过去的约5年中发生了很多事情。 /dev/urandom已更新,现在被认为是现代Linux内核和发行版上随机性的高熵源。在过去的6mo中,我们在使用Ubuntu的Linux 3.19内核上看到了熵饥饿,所以我认为这个问题没有“解决”,但是当要求任意数量的随机性时,很难以低熵随机性结束来自操作系统。


我不想这样说,但是这里发布的其他解决方案都不是正确的“安全会话ID”。

# 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()都不是生成会话ID的不错选择。两者都可能会生成随机结果,但随机并不意味着由于较差而导致安全。请参阅Haldir的“How to Crack a Linear Congruential Generator”或NIST's resources on Random Number Generation。如果您仍想使用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是Python atm中最好的OpenSSL API,因为pyOpenSSL似乎只是为了支持遗留应用程序而维护。

答案 1 :(得分:24)

你可以这样使用uuid library

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

答案 2 :(得分:21)

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

答案 3 :(得分:2)

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'

答案 4 :(得分:1)

它可以像创建随机数一样简单。当然,您必须将会话ID存储在数据库或其他内容中,并检查您生成的每个会话ID,以确保它不是重复的,但如果数字足够大,则可能性不大。