Domanda

Ieri ho chiesto Are GUIDs generato su Windows 2003 sicuro da usare come ID di sessione? e la risposta combinata con combinata con questo articolo I GUID sono univoci a livello globale, ma le sottostringhe dei GUID non sono mi hanno spinto a pensare a sostituire il mio attuale meccanismo di utilizzo dei GUID come ID di sessione nei cookie.

Poiché è un po 'di lavoro per apportare questa modifica, ho deciso di eseguire un rapido test GUID sul mio PC Vista per vedere se una sequenza di GUID era ovviamente deterministica (ciò di cui sono preoccupato è se un attaccante fosse in grado di ottenere una sequenza di GUID generati dal mio server sarebbero in grado di generare nuovi corrispondenti).

Nell'articolo di Raymond Chen (che fa riferimento a questa antichissima specifica UUID e GUID dal 1998) il GUID è composto da:

  • 60 bit di data e ora,
  • 48 bit di identificativo del computer,
  • 14 bit di uniquifier e
  • sei bit sono fissi

Inoltre, se generi 10 GUID, i primi 15 caratteri ASCII (escluso '-') sono il timestamp, i successivi 12 caratteri ASCII sono l'identificatore del computer, i successivi 3.5 caratteri ASCII sono casuali e gli ultimi 1,5 caratteri sono fissi .

Ottenere 10 GUID sul mio PC Vista usando .Net System.Guid.NewGuid () produce:

b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615

L'unico modello riconoscibile da una rapida ispezione visiva è che il 13 ° carattere ASCII è sempre 4.

Di nuovo mi chiedo se fare affidamento su System.Guid per generare ID di sessione pseudo casuali sia abbastanza forte da proteggere un'applicazione web in cui decifrare un ID di sessione varrebbe al massimo migliaia di dollari?

Aggiornamento: Invece di utilizzare un GUID, ora ho intenzione di generare gli ID della mia sessione usando l'approccio seguente. Sto convertendo il numero casuale a 384 bit in una stringa di 0x00 byte in modo che sia adatto per l'uso in un cookie HTTP.

RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);
È stato utile?

Soluzione

Non è una risposta completa, ma posso dirti che la 13ª cifra esadecimale è sempre 4 perché indica la versione dell'algoritmo utilizzato per generare il GUID (id est, v4); inoltre, e cito Wikipedia:

  

Crittanalisi del GUID WinAPI   generatore mostra che, dal momento che   la sequenza di GUID V4 è pseudo-casuale,   dato lo stato iniziale si può   prevedere fino ai successivi 250.000 GUID   restituito dalla funzione UuidCreate.   Questo è il motivo per cui i GUID non devono essere utilizzati   in crittografia, ad es. come chiavi casuali.

Il resto dell'articolo e i suoi riferimenti: http://en.wikipedia.org/wiki/ Guid

- Modifica -

Da un punto di vista della sicurezza, suggerirei di generare l'ID di sessione come desideri, quindi di firmarlo crittograficamente; in questo modo puoi inserire tutte le informazioni che vuoi e poi schiaffeggiare una firma alla fine - il possibile problema è il compromesso tra la dimensione / forza della tua chiave e la dimensione risultante del cookie. I GUID sono utili come ID, ma per la sicurezza farei affidamento solo su una tecnica crittografica dedicata.

Altri suggerimenti

Ti suggerisco di utilizzare System.Security.Cryptography.RandomNumberGenerator . Questo è progettato per produrre numeri che non possono essere retroingegnerizzati. La motivazione di Guid è essere unica. È possibile combinare sia il GUID che il numero casuale sicuro, ma un numero casuale sicuro a 128 bit non avrà mai una collisione in pratica.

Alcune note:

  1. Dubito che qualsiasi implementazione di GUID sia stata progettata per essere crittograficamente sicura. (E questa supposizione sarebbe confermata dall'articolo collegato per l'articolo successivo.)
  2. Il 13 ° carattere ASCII è un significante di quale algoritmo è stato usato per generare il GUID .

Se sei davvero preoccupato di avere ID di sessione forti, forse un hash crittograficamente sicuro di qualcosa che non può essere determinato dall'off-machine sarebbe il tuo approccio migliore. Forse la generazione di un pad una tantum da qualche documento interno o fonte di dati potrebbe anche funzionare.

Cosa stai cercando di fare? Vuoi solo una fonte di numeri casuali?

Guarda random.org e hotbits . Molti anni fa, avevo una libreria Java che raccoglieva numeri da queste fonti e li univa per ottenere una serie casuale piuttosto bella (anche se si presume che i due siti non siano in cahootz).

La risposta breve è che nessun guid non è sufficientemente forte per generare ID di sessione se si desidera impedire che si indovini e si crei un crack.

Per lo stesso motivo per cui non si desidera utilizzare un GUID come chiave AES, non si desidera utilizzarli per nessun tipo di identificazione sensibile.

Un GUID funziona estremamente bene per quello che sono progettati per essere: un ID univoco garantito matematicamente da non ripetere mai.

Anche se decifrare un ID di sessione vale solo $ 1000, immagina se ciò è stato fatto 100 volte. Ora stai parlando di un serio bling.

So che è un modo semplice per usare i GUID ma resistere e affrontare il dolore prendendo le dovute precauzioni per proteggere adeguatamente l'applicazione. I tuoi utenti ti ringrazieranno.

È quasi impossibile ottenere una guida duplicata considerando le possibilità di ottenerne una. Ecco alcuni fatti matematici rapidi

Granelli di sabbia nel mondo 75.000.000.000.000.000.000.000

Numero di GUID 340.282.366.920.938.463.463.374.607.431.770.000.000

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