![](/img/trans.png)
[英]Add session ID or some unique ID per session in python logs
[英]Unique session id in python
如何在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
模块,该模块专为此目的而设计。
如果您需要在Web上为任何目的生成加密安全字符串,请参阅该模块。
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'
它可以像创建随机数一样简单。 当然,您必须将会话ID存储在数据库或其他内容中并检查您生成的每个会话ID以确保它不是重复的,但如果数字足够大,则可能性不大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.