Passa al contenuto principale

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:

  1. 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)
  2. Calcola lo XOR (OR esclusivo bit per bit) della stringa di B byte calcolata al passo (1) con ipad
  3. Aggiungi il flusso di dati 'text' alla stringa di B byte risultante dal passo (2)
  4. Applica H al flusso generato al passo (3)
  5. Calcola lo XOR (OR esclusivo bit per bit) della stringa di B byte calcolata al passo (1) con opad
  6. Aggiungi il risultato di H del passo (4) alla stringa di B byte risultante dal passo (5)
  7. 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.