Sobes.tech
Middle

Cos'è HMAC e come viene utilizzato?

sobes.tech AI

Risposta dell'AI

HMAC (Code di Autenticazione del Messaggio basato su Hash) è un meccanismo per verificare l'integrità e l'autenticità di un messaggio utilizzando una chiave segreta e una funzione hash crittografica.

Algoritmo di funzionamento:

  1. Formazione di chiavi interne ed esterne dalla chiave segreta e costanti (ipad, opad).
  2. Calcolo dell'hash interno: hash(chiave segreta XOR ipad + messaggio).
  3. Calcolo dell'hash esterno: hash(chiave segreta XOR opad + hash interno). Questo è HMAC.

Utilizzi:

  • Autenticazione delle richieste API: Il server e il client condividono una chiave segreta comune. Il client calcola l'HMAC per i dati della richiesta e lo invia nell'intestazione. Il server calcola l'HMAC con gli stessi dati e chiave, confrontandolo con il valore inviato. Se coincidono, la richiesta è considerata autentica.
  • Verifica dell'integrità dei dati: Se l'HMAC del messaggio corrisponde all'HMAC ricalcolato, si può essere sicuri che i dati non siano stati modificati durante la trasmissione.
  • Utilizzo in JSON Web Tokens (JWT): L'HMAC viene spesso usato come algoritmo di firma digitale (HS256, HS384, HS512) per garantire l'integrità dei dati del token.

Esempio di implementazione (pseudo-codice):

function hmacSHA256(key, message) {
    // Costanti di padding
    const blockSize = 64; // per SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Preparazione della chiave
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Hash interno
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Hash esterno (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    return hmac;
}

// Nelle librerie reali, l'implementazione è ottimizzata e diversa

La differenza principale rispetto a un semplice hash con chiave (hash(chiave + messaggio) o hash(messaggio + chiave)) è che l'HMAC è resistente agli attacchi di estensione del messaggio, poiché utilizza due fasi di hash con costanti di padding diverse.