簡體   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