2012-04-23 17 views
12

Sono un po 'confuso come utilizzare AES e HMAC (basata su SHA-256) in modo corretto quando si trasmette il messaggio crittografato dal server al client o viceversaconfuso come utilizzare AES e HMAC

correggetemi per favore se il seguente metodo è sbagliato:

  1. prendere la chiave protetto dal file di chiave (ad esempio, si consiglia di utilizzare l'AES-256 e abbiamo già una chiave valida lunghezza di 256 bit)
  2. Genera IV casuale per AES-256 per essere sicuro che lo stesso testo in chiaro abbia un output di codifica differente.
  3. Calcolare HMAC-SHA-256 utilizzando il testo normale e la chiave di sicurezza. (La prima domanda: dovrei usare IV per il calcolo HMAC? Ad esempio, aggiungere la chiave di sicurezza?)
  4. Criptare il testo normale usando AES-256.
  5. messaggio Componi per il cliente come segue: HMAC + IV + ENCRYPTED_MESSAGE

La più grande domanda è: è possibile in qualche modo di non inviare IV del cliente, ma, invece di generare allo stesso modo ed essere ancora crypto sicuro? O va bene anche mandare la IV?

Ho finito con generazione casuale casuale, perché è necessario che lo stesso testo normale finirà in risultati di crittografia diversi.

risposta

11

Non inviare hmac (messaggio), aes (messaggio). Se invii lo stesso messaggio due volte, chiunque può dirlo. Inoltre, è necessario macare il testo cifrato per prevenire attacchi come lo padding oracle attack.

IV: In generale, il modo più semplice per affrontare il IV è anteporre esso, dal momento che è fissata lunghezza, al cifrario text.You quindi possibile solo leggere tali byte prima decifrare. Le IV possono essere pubbliche, ma devono essere casuali.

HMAC: Il modo più semplice, se supportato dalla libreria, è utilizzare AES in modalità GCM (o, meno preferibilmente EAX). Questo non è in realtà un HMAC, ma fornisce una crittografia autenticata che è altrettanto buona. Se non sono supportati:

È necessario calcolare l'hmac sia sul testo iv che sul codice di crittografia. se || è la concatenazione (che si potrebbe fare con array di copia per esempio se si tratta di array di byte), allora si vuole

CipherText = iv|| aes(key1,iv,message) 
tag = hmac(key2,ciphertext) 

e poi inviare (tag, testo cifrato). Dall'altra parte, si esegue la stessa chiamata hmac per rigenerare il tag e confrontare il tag ricevuto con quello calcolato. Confronta gli hash sha1 o sha256 dei tag invece che direttamente in modo da non perdere dove il confronto fallisce.

È necessario utilizzare una chiave diversa per hmac. In pratica attaccare la somma sha1 della tua chiave di crittografia è abbastanza buono.

+0

E quale modalità di funzionamento raccomanderesti? La CBC ha il suo overhead e dovremmo occuparci del padding. Penso che la mia scelta sia OFB/CFB. – Valentin

+1

Dal punto di vista della sicurezza, sono tutti uguali (eccetto ECB, non usarlo). Assicurati di usare una IV fresca se il sistema prende una flebo. Se vuoi risparmiare qualche sforzo, ci sono modalità autenticate che non hanno bisogno di un hmac. GCM è il migliore di loro. Che lingua stai usando? – imichaelmiers

+0

Non consiglierei di prendere la somma SHA1 del primo tasto come seconda chiave. Invece è possibile derivare due chiavi diverse con parametri diversi e PBKDF2 da una passphrase.La cosa migliore è avere due chiavi indipendenti e non fare affidamento su una passphrase (probabilmente) debole. –