Domanda

Come posso generare un ID sessione univoco in Python?

È stato utile?

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))

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top