Zero padding in HMAC

7

La sezione 2 di RFC 2104 definisce la chiave utilizzata in HMAC dovrebbe essere riempita con zero byte fino alla lunghezza del blocco dell'algoritmo di hash sottostante. Non si tratta di una vulnerabilità di sicurezza potenziale poiché ogni conclusione chiave in un byte zero produrrebbe lo stesso risultato di una chiave senza l'ultimo byte?

Il seguente codice PHP illustra l'esempio:

$key = "key";
$message = "message";
var_dump(hash_hmac("SHA256", $message, $key));
var_dump(hash_hmac("SHA256", $message, $key.chr(0x00)));

e produce il seguente output:

string(64) "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"
string(64) "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"

Sono consapevole che la sezione 3 della stessa RFC raccomanda chiavi di lunghezza minima, che eliminerebbero questo problema, così come una sorta di passaggio di generazione di chiavi con hash. Tuttavia, mi sembra che questo potrebbe essere un potenziale problema o sono eccessivamente paranoico?

    
posta KennethJ 22.01.2012 - 17:49
fonte

2 risposte

7

No, questa non è una vulnerabilità di sicurezza.

HMAC richiede una chiave della dimensione del blocco dell'algoritmo di hash sottostante. In generale, dovresti fornire una chiave che è la dimensione del blocco dell'algoritmo di hash sottostante

Se ti dimentichi di fornire una chiave di queste dimensioni, allora ci sono due opzioni. La prima opzione è che HMAC fallisce in modo rapido e veloce, informandoti che la tua chiave ha le dimensioni sbagliate. La seconda opzione è che HMAC presume semplicemente che intendevi fornire una chiave della giusta dimensione, ma che hai lasciato per sbaglio tutti i byte zero finali che dovevano essere lì.

La seconda opzione di cui sopra si accorda con la politica di essere liberale negli input che si accetteranno ma rigorosa negli output che si genereranno.

Quindi HMAC non perde le informazioni con la seconda opzione, perché una chiave di dimensioni minori non è una chiave valida. C'è semplicemente una politica di prendere le chiavi non valide e in qualche modo renderle valide per la vostra convenienza in modo deterministico e documentato.

    
risposta data 22.01.2012 - 18:57
fonte
3

Con un algoritmo come HMAC, la forza di una chiave si riferisce al numero di possibili chiavi, all'interno del set con cui scegli di lavorare. Ad esempio, potresti voler lavorare con chiavi a 128 bit, nel qual caso tutte le tue chiavi avranno una lunghezza esattamente di 16 byte.

Che due chiavi distinte possano produrre lo stesso comportamento HMAC è un potenziale problema solo se entrambe le chiavi sono possibili nel sistema. Per la questione di cui stai parlando, questo può accadere solo se il tuo sistema accetta chiavi di varie lunghezze, che non è una situazione comune. Se consideri SSL / TLS , HMAC viene utilizzato con una chiave generata dal master secret, con un determinato risolto lunghezza per una determinata funzione di hash (ad esempio se si usa SHA-256, la chiave HMAC avrà sempre una lunghezza di 32 byte). Quindi, nessun problema.

Se le tue chiavi sono stringhe C (cioè stringhe che terminano con un byte di valore 0), allora nessun problema: per definizione, una stringa C non contiene byte di valore 0, quindi non puoi avere due stringhe C distinte che, attraverso lo zero padding, produrrà la stessa chiave.

Se sei veramente turbato a riguardo, un'opzione è quella di sistemare sistematicamente la chiave e usare l'output hash come chiave reale per HMAC (nota che La specifica HMAC impone effettivamente tale hashing quando la chiave è più grande della" dimensione del blocco "della funzione di hash sottostante).

    
risposta data 22.01.2012 - 22:31
fonte

Leggi altre domande sui tag