Sicurezza API REST: HMAC / key hashing vs JWT


16

Ho appena letto questo articolo che ha alcuni anni ma descrive un modo intelligente di proteggere le API REST. Essenzialmente:

  • Ogni client ha una coppia di chiavi pubblica / privata unica
  • Solo il client e il server conoscono la chiave privata; non viene mai inviato tramite il filo
  • Con ogni richiesta, il client accetta diversi input (l'intera richiesta stessa, il timestamp corrente e la chiave privata) e li esegue attraverso una funzione HMAC per produrre un hash della richiesta
  • Il client invia quindi la richiesta normale (che contiene la chiave pubblica) e l'hash al server
  • Il server cerca la chiave privata del client (in base alla chiave pubblica fornita) ed esegue un controllo del timestamp (che certamente non capisco) che verifica che la richiesta non sia vittima di un attacco di riproduzione
  • Se tutto va bene, il server utilizza la chiave privata e la stessa funzione HMAC per generare il proprio hash della richiesta
  • Il server quindi confronta entrambi gli hash (quello inviato dal client e quello che ha generato); se corrispondono, la richiesta viene autenticata e autorizzata a procedere

Poi mi sono imbattuto in JWT , che suona molto simile. Tuttavia, il primo articolo non menziona affatto JWT, quindi mi chiedo se JWT sia diverso dalla soluzione di autenticazione di cui sopra e, in tal caso, come.


1
Lol ... Volevo solo fare la stessa domanda esatta e ho trovato la tua. Una delle prime cose che ho scoperto sull'autenticazione senza stato è stata da AWS: docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/… , e implementato qualcosa di simile a questo massimilianosciacco.com/… . Poi ho trovato JWS / JWT ed è in qualche modo simile. Ma per quanto ho capito JWT è uno standard e le altre soluzioni sopra descritte sono alcune implementazioni personalizzate (non standardizzate). Qualcuno mi corregga se sbaglio.
nyxz,

2
Buono a sapersi, non sono l'unico a preoccuparmi di questo tipo di dettagli! JWT sembra certamente simile e il vantaggio è che è standardizzato. Mi sto solo chiedendo come va (per quanto riguarda la sicurezza) con questa soluzione HMAC personalizzata.
smeeb,

Risposte:


7

Cominciamo con una risposta molto semplice.

JWT (utilizzato nel contesto di OAuth e OpenID) non richiede segreti condivisi tra client e API. Ci sono 3 componenti e coppie di 2 condividono un segreto ciascuno: client <-> server di identificazione, server di identificazione <-> API.

Questo sposta la maggior complessità dall'API al server di identificazione, l'API deve solo verificare che il token sia stato emesso dal server di identificazione e non sia temperato. Per verificare che l'API controlli che la firma JWT sia valida con il singolo segreto condiviso noto tra il server di identificazione e l'API. Questo è tutto!

Il modo in cui il server di identificazione convalida l'identità dell'utente può variare ampiamente (in molti casi è la vecchia coppia nome utente + password su una connessione TLS), ma non ha alcun effetto sulla tua API.

La privacy e la sicurezza del messaggio e del token stesso quando si utilizza JWT sono gestiti da TLS, JWT ignora tali problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.