Esiste un vantaggio dell'utilizzo di JWT stateless su hash SHA256 per token API?

4

Ha senso utilizzare JWT stateless (senza memorizzazione persistente) su SHA256 semplice?

Scenario di esempio:

  1. L'utente accede

  2. Token utente generato come segue:
    un. JWT.encode (userId, 'secret')
    o
    b. SHA256 (userId + 'secret')

  3. L'app client invia una richiesta con userId e token

  4. La richiesta è verificata tramite:
    un. JWT.decode (token, 'secret'), quindi verificare che risultante JWT.userId rispetto a request userId
    o
    b. SHA256 (userId + 'secret'), quindi verifica che l'hash risultante sia stato confrontato con il token di richiesta

JWT consente la scadenza del token, tuttavia oltre a questo non vedo alcun vantaggio?

    
posta SyBer 07.05.2015 - 22:19
fonte

1 risposta

3

Does it make sense to use stateless JWT (without persistent storage) over plain SHA256?

Quello che stai facendo essenzialmente con "plain SHA256" è la firma dei dati e l'invio dei dati + firma separatamente. JWT codifica sia la firma che i dati insieme, ma in entrambi i casi stai praticamente firmando i dati che inviano la firma + dati.

In sostanza sia a che b stanno facendo fondamentalmente la stessa cosa.

Detto questo, ci sono diversi motivi per cui JWT è superiore al metodo che hai proposto.

Uso di HMAC

L'HMAC risolve alcuni punti deboli dei dati di hashing semplici + una chiave segreta:

For example, one might assume the same security that HMAC provides could be achieved with MAC = H(key ∥ message). However, this method suffers from a serious flaw: with most hash functions, it is easy to append data to the message without knowing the key and obtain another valid MAC ("length-extension attack"). The alternative, appending the key using MAC = H(message ∥ key), suffers from the problem that an attacker who can find a collision in the (unkeyed) hash function has a collision in the MAC (as two messages m1 and m2 yielding the same hash will provide the same start condition to the hash function before the appended key is hashed, hence the final hash will be the same).

link

Supporto per la crittografia a chiave pubblica

Per generare il MAC usando solo SHA256 è necessario che entrambe le parti conoscano il segreto del testo normale.

Questo è difficile da mantenere in modo sicuro come:

a. Il segreto deve essere memorizzato e recuperabile in formato di solo testo, quindi nessuna delle due parti può memorizzare il segreto come un hash salato. Questo è particolarmente un problema per il lato di verifica / server in un'applicazione web che potrebbe dover memorizzare segreti per migliaia di utenti.

b. Le parti hanno bisogno di comunicare il segreto condiviso in qualche modo

JWT supporta RSA, un sistema di crittografia a chiave pubblica. Pertanto la parte firmataria deve proteggere la propria chiave privata, ma la parte che effettua la verifica (in genere il server) deve solo conoscere la chiave pubblica. La chiave pubblica è informazione pubblica quindi non è necessario archiviarla in modo sicuro.

Le chiavi pubbliche sono anche più facili da condividere, perché non è necessario comunicare nulla che possa essere usato per firmare i messaggi (anche se un utente malintenzionato potrebbe sostituirlo con la propria chiave pubblica), al contrario del metodo senza RSA dove il segreto deve essere comunicato.

    
risposta data 08.05.2015 - 01:56
fonte

Leggi altre domande sui tag