当前位置:  开发笔记 > 编程语言 > 正文

python中的唯一会话ID

如何解决《python中的唯一会话ID》经验,为你挑选了4个好方法。

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



1> Sean..:

更新时间: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似乎只是为了支持遗留应用程序而维护.


如果我们剥离所有的绒毛,你基本上说的是OpenSSL.rand.bytes(16)是安全的,但os.urandom(16)不是.根据文档,os.urandom的目的是"返回一串适合加密使用的n个随机字节".如果生成一个好的会话ID不是os.urandom适合的"加密用途",那么它的含义是什么?也许正确的解决方案对您来说太简单了,但这对您来说就是Python.无意义的绒毛并不能使事情变得更加安全.
@SeunOsewa,你是正确的文件和`os.urandom`旨在适合加密使用,不幸的是,情况并非总是如此.FreeBSD和OS-X有一个很好的urandom池,Linux被击中或错过(虽然越来越好).明确比隐含更好.顺便说一下,我发布这个的原因是因为我在实际情况下遇到了会话ID冲突,其中没有检查会话ID冲突并且用户看到了彼此的信息.原因?urandom没有正确播种.: - /现实有时咬人.
@SeunOsewa你是对的,OpenSSL和os.urandom都使用相同的熵源(/ dev/urandom)并具有相同的安全级别.
暂定-1.你声称没有证据证明`os.urandom`是不够随机的,而OpenSSL(例如通过M2Crypto)更好.同时@ramirami声称(也没有证据)事实上两者都使用相同的潜在熵源.我不知道谁是对的,但无论如何我都在贬低; 我不喜欢FUD和这里的大胆主张(那个'os.urandom`使用或者可能在某些平台上使用比OpenSSL更糟糕的熵源,以至于前者在后者安全的情况下加密打破)需要证实是有用的.

2> Sverre Rabbe..:

您可以像这样使用uuid库:

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


uuid1(),uuid4()甚至uuid5()都不是很好的会话.有关安全会话ID示例,请参阅http://stackoverflow.com/questions/817882/unique-session-id-in-python/6092448#6092448.
但那不是很随机.
Wiki说"版本4 UUID使用的方案仅依赖于随机数.",如何对会话令牌不利?uuid5和uuid1不是基于随机数,但为什么uuid4不好呢?

3> Seun Osewa..:
import os, base64
def generate_session():
    return base64.b64encode(os.urandom(16))


我认为这是满足我需求的最佳解决方案.我尝试过M2Crypto和PyCrypto,但两者都存在安装以及在Windows上运行时出现的重大问题.

4> Adam Easterl..:

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'

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有