2. Definizione di HMAC (Definition of HMAC)
La definizione di HMAC richiede una funzione di hash crittografica (indicata con H) e una chiave segreta K. Assumiamo che H sia una funzione di hash crittografica che effettua l'hash dei dati iterando una funzione di compressione di base sui blocchi di dati. Indichiamo con B la lunghezza in byte di tali blocchi (per tutti gli esempi di funzioni di hash sopra riportati, B=64) e con L la lunghezza in byte dell'output di hash (L=16 per MD5, L=20 per SHA-1). La chiave di autenticazione K può avere lunghezza arbitraria fino a B (la lunghezza di blocco della funzione di hash). Le applicazioni che utilizzano una chiave di lunghezza superiore a B byte applicheranno prima l'hash alla chiave usando H, quindi useranno la stringa di L byte risultante come chiave effettiva per HMAC. In ogni caso, la lunghezza minima raccomandata per K è di L byte (la lunghezza dell'output di hash). Per ulteriori informazioni sulle chiavi, si veda la sezione 3.
Definiamo due stringhe fisse e distinte ipad e opad nel seguente modo ('i' e 'o' sono mnemonici per inner e outer):
ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times
Per calcolare l'HMAC sui dati text, eseguiamo quanto segue:
H(K XOR opad, H(K XOR ipad, text))
ovvero:
- Aggiungi zeri alla fine di K per creare una stringa di B byte (ad esempio, se la lunghezza di K è di 20 byte e B=64, allora 44 byte di zeri 0x00 verranno aggiunti a K)
- Calcola lo XOR (OR esclusivo bit per bit) della stringa di B byte calcolata al passo (1) con ipad
- Aggiungi il flusso di dati 'text' alla stringa di B byte risultante dal passo (2)
- Applica H al flusso generato al passo (3)
- Calcola lo XOR (OR esclusivo bit per bit) della stringa di B byte calcolata al passo (1) con opad
- Aggiungi il risultato di H del passo (4) alla stringa di B byte risultante dal passo (5)
- Applica H al flusso generato al passo (6) e produci il risultato
A titolo indicativo, in appendice è fornito un codice di esempio basato su MD5.