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.