AES è crittografia ; ha lo scopo di mantenere riservatezza . La crittografia non mantiene la integrità di per sé: un utente malintenzionato che può accedere ai dati crittografati può modificare i byte, con conseguente impatto sui dati in chiaro (sebbene la crittografia renda l'operazione un po 'più difficile per l'autore dell'attacco, non è così non fattibile come spesso si presume).
Per ottenere l'integrità , è necessario un MAC e HMAC è un buon algoritmo MAC .
In molte situazioni in cui è richiesta la crittografia, anche l'integrità deve essere mantenuta, quindi, come regola generale, AES "da solo" non è sufficiente. Nel tuo caso, i potenziali attaccanti sono i clienti stessi; ogni cliente può provare a modificare l'URL in modo da accedere ai dati di qualcun altro, o essere in grado di registrarsi sotto un altro nome, o cosa non va. A quanto ho capito, il tuo "cliente" vuole rimanere padrone della registrazione; vuole decidere quale cliente può registrarsi e sotto quale nome. L'integrità controllata è quindi necessaria.
Esistono diversi modi per combinare la crittografia basata su AES con HMAC; la maggior parte di loro sono cattivi Vedi questa domanda per qualche discussione sul soggetto. Per farla breve:
-
Se puoi, utilizza GCM o qualche altra modalità che fa tutto il duro lavoro di combinare crittografia e MAC in sicurezza.
-
Se non puoi usare GCM (per mancanza di supporto nel tuo framework di programmazione lato server), allora devi fare le cose in vecchio stile:
- Hash il tasto K con SHA-256 in modo da ottenere 256 bit di "materiale chiave". Dividilo in due parti: 128 bit per la crittografia ( K e ), 128 bit per MAC ( K m ).
- Genera un IV casuale di 128 bit. Ne hai bisogno uno nuovo ogni volta che criptalo e vuoi generarlo con un PRNG strong (
/dev/urandom
).
- Riempi i dati (solita imbottitura PKCS # 5) in modo che la sua lunghezza sia un multiplo della dimensione del blocco AES (16 byte).
- Cifra i dati con AES in modalità CBC, utilizzando l'IV generato appena sopra e K e come chiave. Chiamiamo C il testo cifrato risultante.
- Calcola HMAC / SHA-256 con la chiave K m sulla concatenazione di IV e C , in quell'ordine Chiama M il valore risultante. È fondamentale che IV sia parte dell'input di HMAC.
- Concatena IV , C e M , in questo ordine. Questa è la tua "chiave di registrazione".
- Quando si riceve una richiesta di registrazione, verificare innanzitutto l'HMAC (ricalcandolo), quindi (e solo successivamente) procedere alla fase di decrittografia.
Ovviamente, tutto ciò presuppone che ci sia una chiave K , che il tuo client può utilizzare per generare le chiavi di registrazione per i clienti e che il tuo server sappia anche per verificare e decrittografare richieste di registrazione in arrivo. Come con tutte le chiavi, fai attenzione a dove lo memorizzi.