繁体   English   中英

python中的唯一会话ID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM