2009-05-03 21 views

risposta

23

È possibile utilizzare il uuid library in questo modo:

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

Questo è quello che stavo cercando! – Alex

+5

Ma non è molto casuale. – Gumbo

+0

@ Gumbo: si prega di elaborare? – saffsd

1

Può essere semplice come la creazione di un numero casuale. Ovviamente, dovresti memorizzare gli ID di sessione in un database o qualcosa di simile e controllare ognuno di quelli generati per assicurarti che non sia un duplicato, ma le probabilità sono che non lo saranno mai se i numeri sono abbastanza grandi.

+0

Esattamente, da qui la mia soluzione: http://stackoverflow.com/questions/817882/unique-session-id-in-python/818040#818040 –

21
import os, base64 
def generate_session(): 
    return base64.b64encode(os.urandom(16)) 
+0

perché il downmod? –

+1

I duno, ma questa sembra essere una soluzione valida. Tuttavia, ti consigliamo di rimuovere il "/ =" finale e di includere anche un timestamp per minori possibilità di collisione. – Unknown

+1

La possibilità di una collisione dopo 4 miliardi di iterazioni è di 1 su 8 miliardi.Se voglio ridurre ulteriormente la possibilità di una collisione, posso semplicemente aumentare il numero di bit, cioè os.urandom (32). E non capisco cosa dovrebbe portare a spogliarsi del trailing "==". –

1

A cosa serve la sessione? Un'app web? Potresti voler dare un'occhiata a the beaker module. È il modulo predefinito per la gestione delle sessioni in Pylon.

73

UPDATE: 2016-12-21

Molto è accaduto in una delle ultime ~ 5yrs. /dev/urandom è stato aggiornato ed è ora considerato una fonte di casualità ad alta entropia sui moderni kernel e sulle distribuzioni Linux. Negli ultimi 6mo abbiamo visto entropy starvation su un kernel Linux 3.19 usando Ubuntu, quindi non penso che questo problema sia "risolto", ma è abbastanza difficile finire con casualità a bassa entropia quando si richiede una quantità qualsiasi di casualità dal sistema operativo.


Odio dire questo, ma nessuna delle altre soluzioni pubblicati qui sono corrette con riferimento alla fase di "ID sessione sicura."

# pip install M2Crypto 
import base64, M2Crypto 
def generate_session_id(num_bytes = 16): 
    return base64.b64encode(M2Crypto.m2.rand_bytes(num_bytes)) 

uuid() o os.urandom() sono buone scelte per la generazione di ID di sessione. Entrambi possono generare risultati casuali, ma casuale non significa che sia protetto a causa della scarsa entropia. Vedi "How to Crack a Linear Congruential Generator" di Haldir o NIST's resources on Random Number Generation. Se si vuole ancora utilizzare un UUID, quindi utilizzare 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 è meglio API OpenSSL in Python atm come appare pyOpenSSL da mantenere solo per supportare applicazioni legacy.

+0

Queste citazioni relative ai problemi UUID sono utili. Grazie per aver postato questo. Domanda: quale pensi sia il modo migliore per generare un ID di sessione? In particolare con i difetti citati nelle implementazioni UUID, come lo faresti in modo diverso? Sto scrivendo qualcosa di simile ora e sto cercando di trovare l'approccio migliore. Inoltre, deve essere tollerante ai guasti, ad esempio non può dipendere dalla connessione a un server di database. – ratsbane

+0

Qualsiasi degli esempi sopra funzionerebbe. La chiave sta facendo uso di un buon generatore di numeri casuali popolato con "entropia crittograficamente sufficiente". Oltre all'estetica e alla dimensione della rappresentazione, non c'è differenza tra una codifica un valore sufficientemente casuale come una stringa 'Base64' o un' UUID', o anche una stringa con codifica esadecimale. A ognuno il suo. Personalmente preferisco base64 per motivi di dimensioni. – Sean

+0

Grazie. Sembra sano. L'ho scritto questo pomeriggio con – ratsbane