Quando il client si autentica con il nostro servizio, viene emesso un "token" opaco. Questo token include le informazioni, che identificano il client e alcune altre informazioni sul client ("payload"). Il carico utile viene utilizzato dal servizio, quando il client restituisce il token al servizio nelle richieste successive. Il carico utile non deve essere comunicato al cliente, quindi non solo l'integrità deve essere mantenuta, ma anche la riservatezza.
Ecco cosa stavo per utilizzare per generare questo token: - HMAC-SHA256 per l'integrità - AES in modalità CBC per riservatezza
Quindi, dato payload P , le chiavi K1 e K2 per generare il "token" I
- pad P su un multiplo di 16
- genera IV di lunghezza 16
- crittografa P usando AES con K1 e IV
- concatena IV e P crittografato
- ottenere un riassunto del risultato (IV + P crittografato) utilizzando HMAC-SHA256 con K2 come chiave
- concatena il digest con il risultato
Poiché IV e digest sono di lunghezza nota, non sono necessari separatori. Il padding sarà probabilmente fatto con spazi, dal momento che il formato utilizzato per il payload non dà significato agli spazi finali.
Devo dire che non sono molto interessato alla sicurezza, quindi potrei mancare alcune cose molto ovvie. Ad ogni modo, le domande:
- Fare questo sembra molto simile a "rolling my own crypto". Sto reinventando la ruota qui?
- C'è una maggiore sicurezza nell'utilizzo di K1 e K2 separati, dato che saranno memorizzati "side-by-side"? In caso contrario, sarà sicuramente più comodo per me utilizzare la stessa chiave
- ... beh, mi sono perso qualcosa?