Implementazione di un token stateless personalizzato

2

Normalmente userei JWT quando è richiesta l'autenticazione stateless, ma stavo pensando a un semplice sistema token. Che creerà un token durante l'autenticazione di un utente e quindi memorizzerà quel token in una tabella SQL con payload e data di scadenza aggiuntivi.

I payload includeranno l'id utente e altre informazioni come richiesto.

Quindi, quando ho bisogno di convalidare un token, vorrei semplicemente eseguire una query nella tabella e controllare se esiste e se è scaduta o meno.

Sembra soddisfacente, ma ho una domanda qui, cioè se in qualche modo il database viene esposto a un hacker, allora l'hacker sarà in grado di accedere ad ogni account utente usando il proprio token.

Ora la mia domanda è: quali misure necessarie potrebbero essere prese in modo che questo possa essere prevenuto? O è una pessima idea?

    
posta rakibtg 31.05.2018 - 21:50
fonte

1 risposta

3

Il modello di base che descrivi è fondamentalmente il modo più semplice per creare un sistema di gestione delle sessioni stateful. I tuoi utenti otterrebbero un token di sessione opaco (una stringa in modo sicuro casuale di almeno 128 bit di lunghezza), di solito impostato in un cookie con flag di sicurezza. Normalmente si dovrebbe avere una tabella che memorizza sessioni attive, con il token di sessione come chiave primaria e le chiavi esterne che puntano alla tabella Utenti (più eventuali metadati necessari, come i dati di scadenza della sessione, non fare affidamento sul cookie in corso lontano quando dovrebbe). Naturalmente, si presume che non sia possibile archiviare le sessioni in memoria (forse sono di lunga durata o che devono essere memorizzate su server) e ha un notevole impatto sulle prestazioni (molte chiamate al database), quindi di solito useresti molta cache.

Se si desidera utilizzare questo modello ma impedire a un utente malintenzionato che legge con successo la propria tabella Session di impersonare le sessioni attive, è possibile farlo eseguendo ciascun token tramite una funzione hash (come SHA-256 *) prima di memorizzarlo in il database (o cercandolo nel database). Ciò rende ancora possibile controllare rapidamente un determinato token nel database, ma rende praticamente impossibile passare dal vedere il database alla conoscenza dei token validi.

* Va bene usare un hash veloce qui (a differenza delle password), perché la stringa di input è già troppo alta entropia per un hacker alla ricerca di forza bruta. Allo stesso modo, non hai bisogno di sale (anche se l'aggiunta di una non danneggerà nulla tranne alcune prestazioni) perché 2 ^ 128 è un numero troppo grande per una tabella arcobaleno.

    
risposta data 31.05.2018 - 22:01
fonte

Leggi altre domande sui tag