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:
- Formazione di chiavi interne ed esterne dalla chiave segreta e costanti (
ipad,opad). - Calcolo dell'hash interno:
hash(chiave segreta XOR ipad + messaggio). - 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.