Quando utilizzare HMAC insieme a AES?

16

Uno dei miei clienti desidera fornire un URL a ciascuno dei suoi clienti per registrarsi in un sistema. Questo URL conterrebbe un parametro stringa di query con alcuni dati (ad esempio codice, e-mail e nome) dai suoi client crittografati utilizzando AES con CBC, simile a questo (IV è in grassetto):

www.website.com/register?key= 44a74fb9fad889496e970c604e54fdab a367c6e5802252822ce071c35d7f108aea43e6de925cf93dd3d4772974621927a12702428b1d22d82b6f976acc7470f8

Quando un utente accede a questa pagina, lo decrittografa e controlla se i dati sono validi (ad esempio se il codice cliente è valido in un database esterno e se non è già registrato) per mostrare a lui il modulo di registrazione .

Ho visto alcune persone che utilizzano HMAC insieme a AES per crittografare i dati, ma non so se questo è necessario in un caso come questo. La mia domanda è: è abbastanza sicuro? Dovrei usare qualcosa come HMAC insieme al testo in chiaro prima di crittografarlo con AES per autenticare i dati?

    
posta Guilherme Sehn 14.07.2014 - 23:06
fonte

1 risposta

31

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.

    
risposta data 14.07.2014 - 23:25
fonte

Leggi altre domande sui tag