Requisiti per un ID di sessione sicuro?

4

Sto scrivendo un servizio web che memorizza i dati che saranno condivisi tra due sistemi separati.

/session/requestNewSession?args=<data> = > ritorna ID di sessione

/session/requestArgs?session=<session id> = > restituisce <data> memorizzato con la chiave <session id>

Il codice è implementato in python nella libreria twisted matrix e ho scritto il mio id id di sessione:

private_secret = os.urandom(64)
def generateRandomSessionKey():
 rawdata = private_secret + str(time.time()) + string.join(map(chr, [random.randint(0,255) for x in range(100)]),"")
 session_key = hashlib.sha256(rawdata).hexdigest()
 del(rawdata)
 return session_key

Questo è un modo corretto di generare un ID di sessione sicuro (non gestibile)? Se no, qualche idea su cosa dovrei fare in modo diverso?

    
posta Dog eat cat world 29.04.2012 - 16:05
fonte

1 risposta

5

Rispondi. Sì. Questo è un ottimo modo per generare un ID di sessione.

Motivazione. private_secret non sarà gestibile e crittograficamente strong (garantito da urandom() ). Quindi, tutto ciò che serve è che la combinazione di time.time() e i tuoi random.randint() numeri siano unici: quella combinazione non dovrebbe mai ripetersi. Questo dovrebbe essere praticamente garantito. Il generatore di numeri casuali Python non dovrebbe ripetersi per molto tempo, quindi dovresti stare bene.

Per ulteriori informazioni, consulta È un rand di / dev / urandom sicuro per un codice di accesso? per un documento correlato domanda.

Avvertenza L'unico fattore di rischio che posso vedere sarebbe: se si esegue il processo del server in una VM, a partire dallo stesso punto di controllo ogni volta. (In altre parole, prima della distribuzione si avvia il sistema operativo guest nella VM una volta e lo si verifica in quel punto, quindi ogni volta che si avvia il servizio Web, lo si avvia da quel checkpoint.) In quella situazione, os.urandom() , time.time() e random.randint() potrebbero ripetersi, causando l'allocazione dello stesso ID di sessione a due client diversi. Ma finché non usi una VM in questo modo, dovresti stare bene.

Un'alternativa. Un modo più semplice e un'implementazione just-as-secure consisterebbe nell'usare quanto segue:

def generateRandomSessionKey():
    return hexify(os.urandom(16))
    
risposta data 30.04.2012 - 05:11
fonte

Leggi altre domande sui tag