2013-08-06 15 views
8

stiamo usando il codice di seguito per generare un hash HMAC contro un valore sensibile C#Differenza tra HMACSHA256 e HMACSHA512

public string GenerateHMac(string key, string message) 
{ 
    var decodedKey = Convert.FromBase64String(key); 

    var hasher = new HMACSHA256(decodedKey); 

    var messageBytes = Encoding.Default.GetBytes(message); 

    var hash = hasher.ComputeHash(messageBytes); 

    return Convert.ToBase64String(hash); 
} 

Il tasto passato è una stringa codificata base di 256 bit 64. È stata sollevata una domanda sul fatto che dovremmo utilizzare HMACSHA256, HMACSHA384 o HMACSHA512 per cancellare il valore.

  • Quali sono i vantaggi dell'utilizzo di HMACSHA512 su HMACSHA256?
  • È significativamente più sicuro?
  • Ci sono implicazioni drammatiche sulle prestazioni quando si utilizza una chiave più lunga?

Come nota a margine; il valore decodedKey che sto passando al costruttore deve essere una chiave a 512 bit se utilizzo HMACSHA512?

+1

la [pagina wikipedia] (http://en.wikipedia.org/wiki/SHA-2#Comparison_of_SHA_functions) ha alcuni benchmark di prestazioni per loro. – jbabey

risposta

15

Per vedere la forza dei metodi di hash stessi, si prega di dare un'occhiata allo keylength.com website. Vedrai che anche SHA-256 ha un margine di sicurezza abbastanza ampio.

Inoltre, l'algoritmo HMAC è praticamente ignaro degli attacchi all'algoritmo di hash sottostante. HMAC è impermeabile al problema del compleanno, che dimezza la forza chiave della metà dell'output dell'hash. Non si applica semplicemente perché l'avversario non ha la chiave segreta e quindi non può provare a creare collisioni. Questo è il motivo per cui anche HMAC-SHA1 è abbastanza sicuro.


Ora la velocità dell'hash dipende dall'ambiente di esecuzione. Ma in generale si possono fare le seguenti ipotesi:

  1. SHA-1 è generalmente più veloce di qualsiasi implementazione SHA-2 sulla stessa piattaforma;
  2. SHA-512 è più veloce di SHA-256 su macchine a 64 bit (poiché utilizzano l'aritmetica a 64 bit internamente);
  3. SHA-256 è più veloce di SHA-512 su macchine a 8, 16 e 32 bit.

Utilizzare SHA-1 se si prevedono problemi di compatibilità. Altrimenti si può anche andare per SHA-512 (e tagliare il risultato a un numero ragionevole di bit). Lo stato interno e la maggiore sicurezza di SHA-512 potrebbero essere un leggero vantaggio. Ho riscontrato problemi con i clienti che non accettavano alcuna forma di SHA-1 a causa di problemi generali dell'algoritmo; in altre parole, il fatto che non sia sicuro in generale potrebbe ostacolare l'accettazione.


noti che SHA-384 e meno noti SHA-512/256 e SHA-512/224 metodi hash sono una forma particolare di SHA-512, tagliato a 384, 256 e 224 bit in uscita. Quindi la velocità di questi algoritmi è identica. L'unica differenza, a parte la dimensione dell'output, è che queste forme speciali utilizzano internamente diversi valori iniziali. In caso contrario, il taglio SHA-512 a 384 bit è sicuro e veloce come SHA-512/384. Dovresti comunque usare SHA-384 per rimanere compatibile.


La dimensione della chiave di input non dipende dalla funzione di hash sottostante. La chiave è prima mascherata in XOR e quindi sottoposta a hash dalla funzione di hash sottostante; gli algoritmi di hash possono prendere quantità di dati virtualmente illimitate come input.

Si consiglia di utilizzare una dimensione della chiave che è almeno la dimensione del metodo hash utilizzato, altrimenti si potrebbe degradare il margine di sicurezza fornito dal metodo HMAC. Potrebbero esserci delle penalità minori per le prestazioni se la dimensione della chiave impone all'hash dell'algoritmo di hash più blocchi.


Si potrebbe anche utilizzare lo standard (imminente) SHA-3 nel senso che sarebbe sicuro. Al momento HMAC-SHA-3 non ha molto senso. HMAC è effettivamente eccessivo per SHA-3 (Keccak); SHA-3 dovrebbe essere sicuro anche senza il costrutto HMAC. [Modifica] ormai KMAC è stato standardizzato come costrutto MAC per SHA-3.

Oltre a ciò, i costrutti SHA-2 hanno - in qualche modo sorprendentemente - mostrato una buona resistenza contro l'analisi della cripta durante la competizione SHA-3. Quindi non è necessario eseguire l'upgrade a SHA-3.

4

Non penso che sia necessario preoccuparsi dei vantaggi di sicurezza, HmacSha1 è ancora pensato per essere secure pari e la sicurezza dovrebbe essere pensata come relativa alla lunghezza della chiave. Le prestazioni di Sha256 vs Sha512 dipenderanno dall'implementazione, dalla piattaforma e così via, dovrai metterti alla prova. E le lunghezze delle chiavi fornite a HMAC sono indipendenti dall'algoritmo hash, vedi pseudocode.

+0

Il documento delle transizioni NIST (http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf), Tabella 9: Transizioni delle funzioni hash, non consente SHA-1 per determinati usi dopo il 2013, incluso il digitale firme. SHA-1 può ancora essere accettabile per l'utilizzo di HMAC, ma SHA-2 è ampiamente disponibile e non deprecato per nessuna considerazione di sicurezza. Quanto sei a tuo agio come sviluppatore utilizzando un algoritmo di sicurezza che viene gradualmente eliminato per la sua debolezza implicita? – ingyhere

+0

Non stavo raccomandando l'uso di HMACSHA1, stavo dando un esempio molto lontano di come non preoccuparsi della sicurezza di HMACSHA512 vs HMACSHA256 e di concentrarsi invece sulla lunghezza dei tasti. – jbtule

0

HMAC richiama l'algoritmo di hash due volte rispetto a SHA3 non richiede la costruzione HMAC per l'hashing con chiave in modo che l'invocazione doppia sia facilmente evitabile. Come risultato, SHA3 batte HMAC-SHA2 in prestazioni e HMAC-SHA1 in sicurezza (il meglio di entrambi i mondi).