Keyed-Hash Message Authentication Code

Introduzione

Il Keyed-Hash Message Authentication Code (HMAC) è uno standard per l'autenticazione dei messaggi pubblicato dal NIST [1]. Esso impiega un algoritmo di hash assieme ad una chiave segreta per generare un codice da impiegare per garantire l'autenticità del messaggio.

Lo standard non prevede un particolare algoritmo di hash, ed è adattabile ad un qualunque algoritmo impiegato.

Descrizione

Sia L il numero di byte del codice hash generato dall'algoritmo scelto (ad esempio, L=20 per SHA-1, L=32 per SHA-256, L=16 per MD5, ecc.). Sia K la lunghezza della chiave segreta e B quella del blocco di dati in input della funzione di hash.

Se la lunghezza della chiave K è uguale a B allora si pone K0 = K. Se K > B, si effettua l'hash di K per ottenere una stringa di L byte e successivamente si aggiungono zeri per ottenere una stringa di B byte. Se invece K < B, allora si aggiungono degli zeri fino a raggiungere la lunghezza di B byte. Sia K0 la stringa ottenuta in questo modo.

Ad esempio, se come funzione di hash si considera l'algoritmo SHA-1, si ha B=64 e L=20. Quindi se si sceglie una password di lunghezza K=30, essendo K < B si aggiungono 34 byte con valore 0 per raggiungere la lunghezza di 64 byte e si chiama questa stringa di byte K0.

A questo punto si ha una stringa K0. Si effettua una operazione di xor tra K0 e una stringa di byte detta ipad, che è formata da tutti i byte di valore 0x36 (in binario 00110110), quindi si calcola:

(1)
\begin{align} K_0\:\oplus\:ipad \end{align}

A quest'ultimo valore si aggiungono i dati su cui calcolare il codice HMAC, e si applica l'algoritmo di hash. Se M è il messaggio allora:

(2)
\begin{align} Hash((K_0\:\oplus\:ipad) \vert \vert M) \end{align}

Dove l'operatore || indica l'operazione di concatenazione.

Esempio

Sia la chiave K costituita dalla parola "prova", con lunghezza pari a 5 byte. Scegliendo come algoritmo di hash SHA-1, si ha: B=64. Si aggiungono 59 byte con valore 0 (0x00). Se il messaggio è il seguente: "Questa è la mia frase", allora si ottiene:
M = 0x51 0x75 0x65 0x73 0x74 0x61 0x20 0xe8 0x20 0x6c 0x61 0x20 0x6d 0x69 0x61 0x20 0x66 0x72 0x61 0x73 0x65
Quindi:
K0 = 0x70 0x72 0x6f 0x76 0x61 0x00 0x00 … 0x00
K0 xor ipad = 0x46 0x44 0x59 0x40 0x57 0x36 0x36 … 0x36
L'hash di questo valore è:
SHA-1(K0 xor ipad) = 0x2F 0x1C 0x9F 0x86 0x64 0x15 0xE2 0x89 0x37 0x95 0x9E 0x12 0xD8 0x32 0xBF 0xC3 0x00 0xBF 0x99 0xA0

Il risultato dell'operazione di Hash è lungo L byte. L'algoritmo prosegue con l'operazione di xor di K0 con una stringa lunga B byte, in cui ogni byte ha valore 92 (0x5c), chiamata opad, quindi:

(3)
\begin{align} K_0\:\oplus\:opad \end{align}

Si concatenano assieme i valori (2) e (3):

(4)
\begin{align} (K_0\:\oplus\:opad) \vert\vert Hash((K_0\:\oplus\:ipad) \vert\vert M) \end{align}

E si applica nuovamente al valore (4) la funzione di hash:

(5)
\begin{align} Hash((K_0\:\oplus\:opad) \vert\vert Hash((K_0\:\oplus\:ipad) \vert\vert M)) \end{align}

Il valore della (5) rappresenta il codice HMAC. A volte è possibile che il codice HMAC sia di lunghezza inferiore. In questo caso si scelgono gli n byte più significativi (a sinistra) del codice hash.

Esempio

Continuando l'esempio precedente, si procede calcolando:
K0 xor opad = 0x2c 0x2e 0x33 0x2a 0x3d 0x5c 0x5c … 0x5c
Concatenando assieme i risultati precedenti e quello appena ottenuto si ha:
(K0 xor opad) || SHA-1(K0 xor ipad) =
0x2c 0x2e 0x33 0x2a 0x3d 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x5c 0x2F 0x1C 0x9F 0x86 0x64 0x15 0xE2 0x89 0x37 0x95 0x9E 0x12 0xD8 0x32 0xBF 0xC3 0x00 0xBF 0x99 0xA0
Calcolando l'hash di questo valore si ottiene:
SHA-1((K0 xor opad) || SHA-1(K0 xor ipad)) =
0x4e 0xe7 0x30 0x87 0xd6 0xdb 0x46 0x38 0x03 0xea 0x01 0xfe 0xf6 0x60 0xc3 0x71 0xd2 0xc3 0x54 0x01
Si possono utilizzare tutti i 20 byte del codice hash oppure un sottoinsieme di essi come codice HMAC.

Bibliography
1. NIST, FIPS PUB 198a, "The Keyed-Hash Message Authentication Code (HMAC)", Sito web: http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License