In breve, no. Mongo ObjectIds
sono facili da indovinare. In particolare, in caso di carico elevato, si tratta spesso di numeri consecutivi, poiché timestamp, id macchina e processo non cambiano. Se si guarda alla the structure of 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.
Di conseguenza, essi hanno ben poco casualità. Spesso vedo ID consecutivi nel database, ad esempio se un'azione del controller scrive un oggetto dominio e una voce del registro in rapida successione.
Se il timestamp può essere indovinato e l'id della macchina è determinabile (che è a meno che non si disponga di un cluster enorme), rimangono solo cinque byte. Osservando un numero di ID generati, posso probabilmente ridurlo a 50 processi così l'entropia effettiva è da qualche parte nell'intervallo di 28 bit. Questo è ancora difficile da indovinare, ma è troppo rischioso per un token di accesso.
Utilizzare invece un generatore di numeri pseudo casuali crittograficamente avanzato e creare un token da esso. Ad esempio, in .NET, lo RNGCryptoServiceProvider
consente di creare dati casuali di lunghezza arbitraria.
Come sidenote, suggerisco di avere un involucro crittografico ulteriore intorno ai vostri OAuthTokens, per due motivi:
a) Si vuole essere in grado di determinare i token non validi in fretta. 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 client
b) I client possono richiedere più volte token. Sebbene non sia un requisito, quasi tutti i sistemi che conosco restituiscono sempre diversi token (indipendentemente dal fatto che siano auto-validanti o meno). Di solito, è perché il token stesso ha un periodo di validità limitato. Questo non è lo stesso periodo di validità della concessione OAuth.
Nel database, ciò che si desidera archiviare è la concessione, ovvero l'autorizzazione concessa da alcuni utenti a un determinato cliente. Se questa sovvenzione viene rimossa, tutti i token diventano non validi. L'inserimento di un nuovo token ogni volta è molto difficile perché l'utente dovrebbe eliminarli tutti per rimuovere la concessione dell'applicazione.
Buona risposta, grazie. Ho creato un cripto wrapper per generare ora token di accesso, e in realtà significa che ho 1 hit di database in meno per query, che è bello;) –