2011-01-25 7 views
11

Per avviare e definire guid, sto usando un framework .NET Guid Questo è un po una situazione ipotetica utenti quando preformatrici una specifica azione hanno GUID generati. Ogni utente può vedere i propri guids. Se un utente conoscesse uno dei guid di un altro utente ci sarebbe un compromesso di sicurezza.I guids possono essere considerati attendibili per la sicurezza o sono prevedibili se il sistema può essere costretto a generare molti guids noti?

Quanto è sicuro questo sistema se si asume che un utente non ha modo di rubare guid di un altro utente e può solo indovinare?

Capisco che è impossibile indovinare ciecamente i guids. Anche se avessero un milione di valori di successo, avrebbero ancora solo una probabilità 10^20 di indovinare con successo

Dove temo possa esistere un problema è la previsione dei guid. Può un utente generare un gran numero di richieste, guardare i guids che ha ottenuto e conoscere la formula di generazione .net guid migliora notevolmente le sue probabilità di indovinare? Queste quote possono essere ridotte a un punto in cui sarebbero un problema di sicurezza? In questo caso, come devono essere generate le chiavi in ​​un modo non immaginabile unico?

chiedo chi cita le probabilità di tentativi/collisioni di aggiungere qualche significato difficile da esso. O un numero esatto per definire le probabilità, o qualcosa di simile, "può essere utilizzata per memorizzare i dati di account, ma i dati non sensibili"

EDIT

questa domanda sembra andare bene nel territorio Io inizialmente cercato di esplorare con questa domanda Is a GUID a good key for (temporary) encryption?

+1

GUID non sono unici; quindi in teoria due utenti potrebbero avere la stessa guida. –

+0

probabilmente simile a http://stackoverflow.com/questions/4517497/how-secure-are-guids-in-terms-of-predictability –

+0

per i GUID casuali generati correttamente le probabilità di collisione sufficientemente bassi da garantire l'unicità nella pratica. – CodesInChaos

risposta

7

di GUID/UUID del sono destinate a generare 128 numeri di bit per uso principalmente come identità di che sono unici (per tutti gli effetti).

Gli UUID non sono progettati per generare sequenze di numeri casuali crittograficamente forti e, se si desidera la massima non-prevedibilità, sequenze di numeri casuali crittograficamente forti sono esattamente ciò che si desidera. Per questo, .NET ti offre RNGCryptoServiceProvider, progettato da zero per essere tanto imprevedibile quanto ragionevolmente raggiungibile con mezzi algoritmici, quindi perché non usarlo?

Esempio:

byte[] GenerateRandomBytes() 
{ 
    byte[] key = new byte[16]; 

    System.Security.Cryptography.RNGCryptoServiceProvider c = 
     new System.Security.Cryptography.RNGCryptoServiceProvider(); 

    c.GetBytes(key); 

    return key; 
} 
4

Afaik .net genera Version 4 UUIDs come Guidi per impostazione predefinita. Questi sono casuali e difficili da indovinare se implementati correttamente. Ma poiché le versioni future potrebbero utilizzare un'altra implementazione, non mi affiderei a questo. Penso che perfino le versioni precedenti di Windows o .net usavano Guids basate sull'indirizzo Mac che sono più facili da indovinare.

Così mi basta usare uno dei cripto-pseudo-random-number-generatori integrati in .net, invece. Se generi 16 byte hai una sostituzione drop-in per un Guid.

+2

potresti definire "difficile da indovinare". Sicuro abbastanza per forum, abbastanza sicuro per una banca, abbastanza sicuro per la sicurezza nazionale – Andrey

+0

Un numero casuale a 128 bit è abbastanza sicuro per qualsiasi cosa (ben la sicurezza nazionale richiede determinati processi di certificazione, quindi l'implementazione ad-hoc non può essere utilizzata). La qualità dei numeri è il problema. Questo è il motivo per cui ho consigliato di non utilizzare il generatore GUID standard, ma un crypto-prng. – CodesInChaos

+1

Ci sono altri attacchi molto più probabili che indovinare casualmente un numero casuale valido di quella dimensione. – CodesInChaos

Problemi correlati