如何在Python中生成唯一的会话ID?
更新时间: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的" 如何破解线性同余生成器 "或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是Python atm中最好的OpenSSL API,因为pyOpenSSL似乎只是为了支持遗留应用程序而维护.
您可以像这样使用uuid库:
import uuid my_id = uuid.uuid1() # or uuid.uuid4()
import os, base64 def generate_session(): return base64.b64encode(os.urandom(16))
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'