MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Utilizzo di _id generati da MongoDB come dati segreti (ad es. token OAuth)

In breve, no. Mongo ObjectIds sono facili da indovinare. In particolare, sotto carico elevato, questi sono spesso numeri consecutivi, perché timestamp, ID macchina e processo non cambiano. Se guardi la struttura di Objectid , sono composti da

a 4-byte timestamp, 
a 3-byte machine identifier, 
a 2-byte process id, and 
a 3-byte counter, starting with a random value.

Quindi, hanno pochissima casualità. Vedo spesso ID consecutivi nel database, ad esempio se un'azione del controller scrive un oggetto di dominio e una voce di registro in rapida successione.

Se è possibile indovinare il timestamp e l'id della macchina è determinabile (cosa che è a meno che non si disponga di un cluster enorme), rimangono solo cinque byte. Osservando un certo numero di ID generati, posso probabilmente ridurlo a 50 processi in modo che l'entropia effettiva sia da qualche parte nell'intervallo di 28 bit. Questo è ancora difficile da indovinare, ma è troppo rischioso per un token di accesso.

Usa invece un generatore di numeri pseudo casuali crittograficamente forte e crea un token da quello. Ad esempio, in .NET, il RNGCryptoServiceProvider permette di creare dati casuali di lunghezza arbitraria.

Come nota a margine, suggerisco di avere un wrapper crittografico aggiuntivo attorno ai tuoi OAuthToken, per due motivi:

a) Vuoi essere in grado di determinare rapidamente i token non validi. Una shell crittografica valida potrebbe ancora includere un token non valido (una concessione revocata o scaduta), ma non è necessario colpire il database con attacchi di forza bruta ogni volta. Inoltre, il cliente

b) I clienti possono richiedere i token più e più volte. Sebbene non sia un requisito, quasi tutti i sistemi che conosco restituiscono ogni volta token diversi (indipendentemente dal fatto che si autovalidino o meno). Di solito, questo perché il token stesso ha un periodo di validità limitato. Non è lo stesso periodo di validità della sovvenzione OAuth.

Nel database, ciò che vuoi davvero memorizzare è la concessione, ovvero l'autorizzazione che è stata data da un utente a un cliente. Se questa concessione viene rimossa, tutti i token diventano non validi. Inserire un nuovo token ogni volta è molto scomodo perché l'utente dovrebbe eliminarli tutti per rimuovere effettivamente la concessione dell'applicazione.