Sea*_*ean 77
更新时间: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))
Run Code Online (Sandbox Code Playgroud)
无论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')
Run Code Online (Sandbox Code Playgroud)
要么:
# pip install pyOpenSSL
import uuid, OpenSSL
uuid.UUID(bytes = OpenSSL.rand.bytes(16))
# UUID('c9bf635f-b0cc-d278-a2c5-01eaae654461')
Run Code Online (Sandbox Code Playgroud)
M2Crypto是Python atm中最好的OpenSSL API,因为pyOpenSSL似乎只是为了支持遗留应用程序而维护.
Sve*_*ier 25
您可以像这样使用uuid库:
import uuid my_id = uuid.uuid1() # or uuid.uuid4()
Seu*_*ewa 22
import os, base64
def generate_session():
return base64.b64encode(os.urandom(16))
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
正在使用:
>>> make_token()
'B31YOaQpb8Hxnxv1DXG6nA'
Run Code Online (Sandbox Code Playgroud)