Riservatezza e integrità per la sessione web

3

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?
posta shylent 20.02.2013 - 09:03
fonte

2 risposte

5

Bene, voi state reinventando la ruota, ma almeno utilizzate una forma circolare per questo, che è migliore di quella che fanno la maggior parte degli inventori di ruote. E, francamente, c'è un po 'di carenza di ruote di alta qualità immediatamente utilizzabili.

Utilizzi CBC con una IV (che deve essere generata con un strong PRNG ), e va bene. Si applica HMAC sui dati crittografati e è buono . Non dimentichi di includere IV nell'input di HMAC, che sarebbe stato il classico errore di encrypt-then-MAC. E stai usando chiavi distinte per la crittografia e il MAC, che è bello. Quindi, davvero, non è affatto male.

Potresti prendere in considerazione i seguenti punti:

  • Nel tuo formato, non vi è alcuna indicazione su quali algoritmi vengono utilizzati, quindi non c'è agilità algoritmo : se domani si desidera passare a un altro algoritmo di crittografia, non è possibile farlo senza rompere la compatibilità con i carichi utili esistenti (a meno che non giochi con la lunghezza totale). Per un'agilità pulita dell'algoritmo, potresti voler aggiungere un'intestazione: un singolo byte con un valore convenzionale, ad es. sempre 0x01 (le versioni successive del formato del carico utile utilizzerebbero altri valori). Nota importante: se lo fai, non dimenticare di aggiungere anche il byte di intestazione nell'input HMAC.

  • Se avere due chiavi K1 e K2 è scomodo per te, potresti voler memorizzare una sola chiave K , e derivano chiavi K1 e K2 da K . Finché il processo di derivazione è unidirezionale e uniforme, questo andrà bene. Vogliamo che la chiave di crittografia e la chiave MAC siano distinte in modo da evitare brutte interazioni tra i due algoritmi; tali interazioni non sono note nel caso di AES-CBC e HMAC / SHA-256, ma "meglio prevenire che curare". Nel tuo caso, solo hash K con SHA-256, usa la prima metà (128 bit) per K1 , la seconda metà (128 bit) per K2 .

  • Esistono nuove crittografia autenticata che combinano crittografia e controllo dell'integrità e fanno tutto il duro lavoro per tu. In particolare, GCM e EAX sono considerati sicuri e privi di brevetti. Offrono alcuni bonus: non c'è bisogno di un random IV (è sufficiente una IV non ripetitiva come un contatore), non c'è bisogno di padding (si basano sulla modalità CTR internamente), solo una chiave (qualsiasi "espansione" è gestita internamente).

  • Se un utente può ottenere diversi payload, allora può cambiarli e riprodurre vecchi payload. A seconda del contesto, questo potrebbe o non potrebbe essere un problema per te.

  • Se le chiavi non sono specifiche dell'utente, gli utenti collusi possono scambiare i payload. A seconda del contesto, questo potrebbe o non potrebbe essere un problema per te.

risposta data 20.02.2013 - 13:29
fonte
2

The padding will probably be done with spaces, since the format used for payload does not give significance to trailing spaces.

È probabile che starai meglio usando uno schema di riempimento standard e poi inventando il tuo. Ad esempio, riempire fino a n byte utilizzando n ripetendo byte di n o aggiungendo un blocco pad fittizio se è già di lunghezza adeguata.

    
risposta data 20.02.2013 - 16:20
fonte

Leggi altre domande sui tag