Sto implementando un servizio Web REST utilizzando C# che sarà ospitato su Azure come servizio cloud. Poiché si tratta di un servizio REST, è senza stato e quindi non contiene cookie o stati di sessione.Implementazione token autenticazione servizio Web REST
È possibile accedere al servizio Web tramite HTTPS (certificato fornito da StartSSL.com).
Quando un utente accede con successo al servizio riceverà un token di sicurezza. Questo token fornirà l'autenticazione nelle comunicazioni future.
Il token conterrà un timestamp, un ID utente e un indirizzo IP del client.
Tutte le comunicazioni avverranno solo tramite HTTPS, quindi non sono preoccupato del fatto che il token sia intercettato e utilizzato negli attacchi di replay; il token avrà comunque una scadenza.
Poiché si tratta di un servizio pubblico, sono comunque preoccupato che qualcuno possa registrarsi con il servizio, accedere e quindi modificare il token che ricevono per accedere agli account di altri utenti.
Mi chiedo il modo migliore per proteggere il contenuto del token e verificare anche che non sia stato manomesso.
ho intenzione di fare quanto segue per fissare il token:
Il client accede con successo nel servizio e il servizio fa:
- generare un valore casuale e patate con SHA256 1000 volte.
- Generare una chiave di sessione monouso dalla chiave privata + valore casuale con hash.
- Hash della chiave di sessione con SHA256 1000 volte e quindi utilizzarlo per crittografare il token
- Utilizzare la chiave privata per firmare il token crittografato tramite RSA.
- Invia il token crittografato + la firma + il valore casuale con hash al client in un pacchetto JSON non crittografato.
Quando il client chiama un servizio, invia al servizio il token e la firma crittografati in un pacchetto JSON non crittografato. Il servizio sarà
- Ricreare la chiave di sessione dalla chiave privata + il valore casuale hash
- Usare la chiave privata per verificare la firma
- Usare la chiave di sessione hash per decifrare il token
- Verificare che il token non è scaduto
- Continuare con l'operazione richiesta ...
io in realtà non so nulla di crittografia quindi ho alcune domande:
- È sufficiente o eccessivo?
- Ho letto che per rilevare la manomissione dovrei includere un HMAC con il token. Dal momento che sto firmando con la chiave privata, ho ancora bisogno di un HMAC?
- Devo usare Rijndael invece di RSA?
- Se Rijndael è preferito, l'IV generato è necessario per decodificare? posso buttarlo via o devo inviarlo sarà il token crittografato? per esempio. Token crittografato + HMAC + IV ha cancellato il valore casuale.
Poiché tutte le comunicazioni avvengono su HTTPS, il pacchetto JSON non crittografato non è realmente non criptato fino a quando non raggiunge il client.
Inoltre, potrei voler ri-implementare il servizio in PHP in seguito, quindi tutto ciò deve essere possibile anche in PHP.
Grazie per il vostro aiuto
Grazie per quello. Ho deciso di usare Rijndael e HMAC ma sto ancora cercando di capirlo. Posso usare IV per ricavare la chiave di sessione dalla chiave principale? Posso usare anche la stessa chiave di sessione per l'HMAC o devo ricavare una nuova chiave dalla chiave di sessione corrente? Se ho bisogno di una nuova chiave per HMAC posso usare l'attuale IV per questo o ho bisogno anche di un nuovo valore casuale? Alla fine hai detto che non dovrei crittografare il timestamp con l'ID utente, come posso quindi sapere che il token è scaduto? poiché non riesco a memorizzare un record di sessione nel database. Grazie ancora. –
Grandi domande. Aggiornerò la risposta con alcune informazioni aggiuntive –
Ok, ho capito tutto. Quindi l'HMAC viene calcolato dai dati non crittografati e quindi crittografato con i dati? Devo memorizzare l'HMAC sul server per confrontare in seguito o posso decrittografare il token e quindi calcolare l'HMAC dai dati ora non crittografati e confrontarlo con l'HMAC che è stato crittografato con i dati? –