ID sessione univoco in Python
Domanda
Come posso generare un ID sessione univoco in Python?
Soluzione
Puoi utilizzare la uuid library in questo modo:
import uuid my_id = uuid.uuid1() # or uuid.uuid4()
Altri suggerimenti
AGGIORNAMENTO: 21-12-2016
Sono successe molte cose negli ultimi ~ 5 anni. / dev / urandom
è stato aggiornato ed è ora considerato una fonte di casualità ad alta entropia sui moderni kernel e distribuzioni Linux. Nell'ultimo 6mo abbiamo visto la fame nell'entropia su un kernel Linux 3.19 usando Ubuntu, quindi non penso che questo problema sia "risolto", ma è sufficientemente difficile finire con casualità a bassa entropia quando si richiede una quantità di casualità dal sistema operativo.
Odio dirlo, ma nessuna delle altre soluzioni pubblicate qui è corretta per quanto riguarda l'essere un "ID sessione sicuro". "
# pip install M2Crypto
import base64, M2Crypto
def generate_session_id(num_bytes = 16):
return base64.b64encode(M2Crypto.m2.rand_bytes(num_bytes))
Né uuid ()
o os.urandom ()
sono buone scelte per generare ID di sessione. Entrambi possono generare risultati casuali , ma casuali non significa che sia sicuro a causa della scarsa entropia . Vedi " Come craccare un generatore congruenziale lineare " di Haldir o risorse del NIST sulla generazione di numeri casuali . Se desideri comunque utilizzare un UUID, utilizza un UUID che è stato generato con un buon numero casuale iniziale:
import uuid, M2Crypto
uuid.UUID(bytes = M2Crypto.m2.rand_bytes(num_bytes)))
# UUID('5e85edc4-7078-d214-e773-f8caae16fe6c')
o
# pip install pyOpenSSL
import uuid, OpenSSL
uuid.UUID(bytes = OpenSSL.rand.bytes(16))
# UUID('c9bf635f-b0cc-d278-a2c5-01eaae654461')
M2Crypto è la migliore API OpenSSL in Python atm poiché pyOpenSSL sembra essere gestito solo per supportare applicazioni legacy.
import os, base64
def generate_session():
return base64.b64encode(os.urandom(16))
Python 3.6 rende la maggior parte delle altre risposte un po 'obsolete. Le versioni tra cui 3.6 e successive includono il modulo secrets
, progettato proprio per questo scopo.
Se devi generare una stringa crittograficamente sicura per qualsiasi scopo sul web, fai riferimento a quel modulo.
https://docs.python.org/3/library/secrets.html
Esempio:
import secrets
def make_token():
"""
Creates a cryptographically-secure, URL-safe string
"""
return secrets.token_urlsafe(16)
In uso:
>>> make_token()
'B31YOaQpb8Hxnxv1DXG6nA'
Può essere semplice come creare un numero casuale. Ovviamente, dovresti archiviare gli ID di sessione in un database o qualcosa del genere e controllare ognuno di essi generato per assicurarti che non sia un duplicato, ma è probabile che non lo sarà mai se i numeri sono abbastanza grandi.