2014-09-26 10 views
5

Utilizzando nodejs e Crypto, in questo momento, quando un utente accede a, ho generano un caso token di autenticazione:Generazione token unici in un NodeJS, ambiente di autenticazione Crypto Token

var token = crypto.randomBytes(16).toString('hex'); 

So che è improbabile, ma non v'è una piccola possibilità che due token abbiano lo stesso valore.

Questo parametro può teoricamente essere autenticato da un altro account.

Ora, vedo due metodo ovvio per ottenere passare questo:

  • Quando ho generare il token, interrogare il database degli utenti e vedere se un gettone con lo stesso valore già esiste. Se lo fa, genera semplicemente un altro. Come potete vedere, questo non è perfetto poiché sto aggiungendo query al database.
  • Poiché ogni utente ha un nome utente univoco nel mio database, è possibile che
    generi un token casuale utilizzando il nome utente come chiave di generatore segreta. In questo modo, non c'è modo di avere due token con lo stesso valore. Può lo crypto farlo? È sicuro?

Come lo faresti?

risposta

8

È troppo improbabile che si verifichi per caso. Non vorrei sacrificare le prestazioni per bloccare e controllare il database per questo.

Considerate questo estratto dal Pro Git circa la possibilità di collisioni tra i 20 byte somme SHA1:

Ecco un esempio per dare un'idea di quello che sarebbe stato necessario per ottenere una collisione SHA1. Se tutti i 6,5 miliardi di umani sulla Terra stavano programmando, e ogni secondo, ognuno produceva codice equivalente a dell'intera storia del kernel Linux (1 milione di oggetti Git) e spingeva in un enorme repository Git, ci vorrebbero 5 anni fino a quando il repository conteneva abbastanza oggetti per avere una probabilità del 50% di una collisione di singolo oggetto SHA-1 . Esiste una probabilità più elevata [per progetti medi] che ogni membro dello staff di programmazione dello venga attaccato e ucciso dai lupi in incidenti non correlati nella stessa notte.

se si è ancora preoccupato per quella probabilità, è possibile utilizzare byte casuali invece di 16.

Ma per quanto riguarda la tua seconda idea: se si hash l'ID casuale con il nome utente, quindi che potrebbe hash si scontrano , proprio come potrebbe fare l'ID casuale. Non hai risolto nulla.

+0

Hai appena mi ha dato un'altra idea ... quando l'utente entra, mi cercherà per il quale utente ha quel certo pedina .. se la query trova più di un risultato, basta fare di nuovo l'accesso per l'utente - in questo modo posso gestire anche lo scenario peggiore - cosa ne pensi? –

+1

La possibilità che il tuo server generi casualmente una collisione tra token tra due utenti è molto inferiore alla possibilità che un utente malintenzionato motivato indovini un token di un altro utente. Se ritieni che il primo caso sia un potenziale problema, dovresti credere che il secondo caso sia più un problema e affrontarlo utilizzando più byte casuali. Se si ritiene che 16 byte siano sufficienti a impedire a un attaccante di forza bruta motivato di indovinare il token di un utente target, è necessario che i 16 byte siano sufficienti per impedire al server di generare una collisione. – AgentME

+0

risposta stupefacente in generale a cripto – hauron

0

È sempre necessario aggiungere un vincolo UNIQUE alla colonna del database. Ciò creerà un indice implicito per migliorare le ricerche per questa colonna e farà in modo che nessuno dei due record abbia mai lo stesso valore. Quindi, nella peggiore delle ipotesi, si otterrà un'eccezione del database e non una violazione della sicurezza.

Inoltre, a seconda della frequenza con cui è necessario creare token univoci, penso che nella maggior parte dei casi sia perfettamente corretto utilizzare le ricerche del database durante la generazione.Se la tua colonna, di nuovo, è indicizzata correttamente, sarà una query piuttosto veloce. La maggior parte dei database è molto scalabile orizzontalmente, quindi se stai costruendo un nuovo Facebook è di nuovo un'opzione. Inoltre, sarà probabilmente necessario effettuare una query per verificare comunque l'univocità dell'e-mail.

Infine, se si è veramente preoccupati delle prestazioni, è sempre possibile pre-generare un milione di token unici e memorizzarli nella tabella del database separata per un utilizzo rapido. Basta impostare una routine per controllarne periodicamente l'utilizzo e inserire altri record, se necessario.

Problemi correlati