如何在Python中生成唯一的会话ID?
答案 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,以确保它不是重复的,但如果数字足够大,则可能性不大。