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.