Generatore HMAC

Genera firme HMAC con SHA-256, SHA-384 o SHA-512

Algoritmo

Messaggio

Esegue in locale · Sicuro per incollare segreti

Chiave segreta

Esegue in locale · Sicuro per incollare segreti

Firma HMAC

La firma HMAC apparirà qui…

Cos'è HMAC?

HMAC (Hash-based Message Authentication Code) è una costruzione crittografica definita nell'RFC 2104 che combina una funzione hash con una chiave segreta per produrre un tag di autenticazione di dimensione fissa. A differenza di un hash semplice, che chiunque può calcolare, un HMAC può essere generato e verificato solo dalle parti che condividono la chiave segreta. HMAC è il meccanismo standard per verificare sia l'integrità che l'autenticità di un messaggio — confermando che i dati non sono stati alterati e che provengono da un mittente affidabile.

L'algoritmo HMAC funziona con qualsiasi funzione hash iterativa: SHA-256, SHA-384, SHA-512 e persino funzioni legacy come SHA-1 o MD5. Il risultato viene identificato dalla funzione sottostante — HMAC-SHA256, HMAC-SHA384 o HMAC-SHA512. Poiché la sicurezza di HMAC dipende dalla resistenza alle collisioni della funzione hash e da certe proprietà pseudocasuali, gli algoritmi della famiglia SHA-2 sono la scelta raccomandata per i nuovi sistemi. HMAC-SHA256 è la variante più diffusa, usata in AWS Signature V4, i webhook di Stripe, i segreti webhook di GitHub, la firma delle richieste di Slack e i JSON Web Token (HS256).

Il design di HMAC offre una proprietà critica che il semplice hashing non ha: la resistenza agli attacchi di estensione della lunghezza. Con SHA-256 da solo, un attaccante che conosce H(messaggio) può calcolare H(messaggio || dati_attaccante) senza conoscere il messaggio originale. La struttura a doppio hashing di HMAC (hash interno e hash esterno con chiavi con padding differenti) previene completamente questo attacco. Ecco perché gli schemi di firma API usano HMAC invece di concatenare una chiave segreta al messaggio e calcolarne l'hash.

Perché usare un generatore HMAC online?

Il calcolo delle firme HMAC richiede normalmente di scrivere codice o usare strumenti da riga di comando. Questo generatore HMAC basato su browser ti consente di creare firme HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 immediatamente, senza installare software o passare al terminale.

Calcolo HMAC istantaneo
Inserisci il messaggio e la chiave segreta, seleziona l'algoritmo hash e ottieni immediatamente la firma HMAC. La Web Crypto API gestisce il calcolo in modo nativo nel tuo browser.
🔒
Elaborazione privacy-first
Il tuo messaggio e la tua chiave segreta non lasciano mai il tuo dispositivo. Tutto il calcolo HMAC viene eseguito localmente tramite la Web Crypto API — nessuna richiesta al server, nessun log, nessuna conservazione dei dati.
📋
Supporto di più algoritmi
Passa da HMAC-SHA256 a HMAC-SHA384 e HMAC-SHA512 con un clic. Confronta gli output tra gli algoritmi per verificare che la tua implementazione backend corrisponda.
🔍
Nessun account o installazione
Funziona su qualsiasi browser moderno — Chrome, Firefox, Safari, Edge. Nessuna registrazione, nessuna estensione, nessuna configurazione da riga di comando. Apri la pagina e inizia subito a generare firme HMAC.

Casi d'uso del Generatore HMAC

Sviluppatore Frontend — Verifica delle Firme Webhook
Stripe, GitHub e Shopify firmano i payload webhook con HMAC-SHA256. Usa questo strumento per calcolare la firma attesa da un payload e un segreto, poi confrontala con la firma nell'header HTTP durante lo sviluppo.
Backend Engineer — Firma delle Richieste API
AWS Signature V4 richiede HMAC-SHA256 in più fasi del processo di firma. Genera valori HMAC di riferimento durante lo sviluppo per fare il debug dei disallineamenti di firma e verificare i passaggi di calcolo intermedi.
DevOps — Validazione della Rotazione dei Segreti
Quando si ruotano i segreti webhook o le chiavi di firma API, calcola le firme HMAC con la vecchia e la nuova chiave per confermare che la tua applicazione gestisce correttamente la transizione prima della scadenza della chiave precedente.
QA Engineer — Vettori di Test per le Firme
Genera vettori di test HMAC con input e chiavi noti per costruire test di regressione per il tuo middleware di autenticazione. Verifica che la tua implementazione gestisca correttamente messaggi vuoti, input Unicode e chiavi lunghe.
Data Engineer — Autenticazione dei Messaggi nelle Pipeline
Allega firme HMAC ai messaggi nelle pipeline event-driven (Kafka, SQS) per verificare che i messaggi non siano stati manomessi durante il transito tra i servizi.
Studente — Elaborato di Crittografia
Sperimenta con HMAC per capire come la modifica di un singolo carattere nel messaggio o nella chiave produce una firma completamente diversa. Confronta l'output HMAC con l'output SHA-256 semplice per osservare la differenza che introduce una chiave segreta.

HMAC vs Hash Semplice vs Cifratura

HMAC, l'hashing semplice e la cifratura servono a scopi diversi. HMAC fornisce autenticazione dei messaggi — la prova che il messaggio è stato creato da qualcuno con la chiave segreta e non è stato modificato. Un hash semplice fornisce integrità ma non autenticazione. La cifratura fornisce riservatezza. La tabella seguente chiarisce le distinzioni.

ProprietàHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

Confronto degli Algoritmi HMAC

HMAC può usare qualsiasi funzione hash, ma la scelta dell'algoritmo sottostante determina la dimensione dell'output, il livello di sicurezza e la compatibilità con il browser. HMAC-SHA256 è la scelta più comune per i nuovi sistemi. La tabella seguente confronta le varianti che probabilmente incontrerai.

AlgoritmoDimensione DigestLunghezza HexWeb Crypto APIIdeale Per
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

Come Funziona HMAC Internamente

HMAC applica la funzione hash sottostante due volte con due padding derivati dalla chiave diversi. La costruzione è definita nell'RFC 2104 ed è dimostrata essere una PRF (funzione pseudocasuale) in base alle ipotesi crittografiche standard. La chiave viene prima riempita con padding o hashata per corrispondere alla dimensione del blocco della funzione hash (64 byte per SHA-256, 128 byte per SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

L'algoritmo esegue l'XOR della chiave con padding con una costante di padding interno (ipad, 0x36 ripetuto), la concatena con il messaggio e ne calcola l'hash. Poi esegue l'XOR della chiave con padding con una costante di padding esterno (opad, 0x5C ripetuto), la concatena con l'output dell'hash interno e calcola nuovamente l'hash. Questa struttura a doppio hashing è ciò che previene gli attacchi di estensione della lunghezza e garantisce che l'output HMAC non possa essere calcolato senza conoscere la chiave segreta.

Esempi di Codice HMAC

HMAC è supportato nativamente in tutti i principali linguaggi e runtime. La Web Crypto API fornisce HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 nei browser senza alcuna libreria. Gli esempi seguenti mostrano pattern di utilizzo reali, inclusa la verifica dei webhook e il confronto a tempo costante.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

Domande Frequenti

Qual è la differenza tra HMAC e un hash semplice?
Un hash semplice (SHA-256, MD5) prende solo un messaggio come input e produce un digest che chiunque può calcolare. HMAC prende sia un messaggio che una chiave segreta, producendo una firma che solo chi possiede la chiave può generare o verificare. Questo significa che HMAC fornisce autenticazione (prova dell'identità del mittente) in aggiunta al controllo dell'integrità. Un hash semplice dimostra solo che i dati non sono cambiati, non chi li ha prodotti.
HMAC-SHA256 è sicuro?
Sì. HMAC-SHA256 è considerato sicuro al 2026. La sua sicurezza si basa sulle proprietà pseudocasuali di SHA-256 e sulla costruzione HMAC stessa (RFC 2104). Nessun attacco pratico contro HMAC-SHA256 è stato dimostrato. Anche HMAC-MD5 e HMAC-SHA1 rimangono sicuri in pratica perché la sicurezza di HMAC non richiede la piena resistenza alle collisioni della funzione hash sottostante, sebbene le varianti SHA-2 siano raccomandate per i nuovi sistemi.
Perché i webhook usano HMAC invece di cifrare il payload?
I payload webhook contengono tipicamente dati che il ricevente già si aspetta — dettagli degli ordini, notifiche di eventi, aggiornamenti di stato. L'obiettivo non è nascondere i dati (riservatezza) ma dimostrare che provengono dal mittente legittimo e non sono stati modificati in transito (autenticità e integrità). HMAC raggiunge questo con un overhead minimo: il mittente calcola un HMAC del payload con un segreto condiviso e lo include in un header HTTP. Il ricevente ricalcola l'HMAC e li confronta. La cifratura aggiungerebbe complessità e oneri di gestione delle chiavi non necessari.
Come devo confrontare le firme HMAC in modo sicuro?
Usa sempre una funzione di confronto a tempo costante. In Python, usa hmac.compare_digest(). In Node.js, usa crypto.timingSafeEqual(). In Go, usa hmac.Equal(). Gli operatori di uguaglianza sulle stringhe standard (== o ===) possono rivelare informazioni di temporizzazione: un attaccante può misurare quanto tempo impiega il confronto per determinare quanti byte della firma contraffatta corrispondono a quella corretta, poi forza bruta sui byte rimanenti uno alla volta.
HMAC può essere invertito per recuperare la chiave segreta?
No. HMAC si basa su una funzione hash unidirezionale, quindi non esiste una scorciatoia matematica per estrarre la chiave da un output HMAC. Un attaccante dovrebbe fare forza bruta sullo spazio delle chiavi, il che non è fattibile per chiavi di 128 bit o più. Tuttavia, chiavi deboli o corte (come semplici password) possono essere vulnerabili agli attacchi a dizionario, quindi usa sempre chiavi casuali crittograficamente sicure di almeno 256 bit per HMAC-SHA256.
Cosa succede se la chiave HMAC è più lunga della dimensione del blocco hash?
Se la chiave segreta è più lunga della dimensione del blocco della funzione hash (64 byte per SHA-256, 128 byte per SHA-512), l'algoritmo HMAC prima calcola l'hash della chiave con la funzione hash sottostante per ridurla alla lunghezza dell'output hash, poi usa quell'hash come chiave effettiva. Questo significa che chiavi molto lunghe non forniscono sicurezza aggiuntiva oltre la dimensione dell'output hash. Per HMAC-SHA256, le chiavi più lunghe di 64 byte vengono hashate a 32 byte e non offrono alcun miglioramento di sicurezza rispetto a una chiave di 64 byte; le chiavi fino a 64 byte vengono usate nella loro lunghezza completa.
Quando dovrei usare HMAC-SHA512 invece di HMAC-SHA256?
Usa HMAC-SHA512 quando il protocollo lo richiede (alcune funzioni di derivazione delle chiavi come HKDF-SHA512, generazione di chiavi Ed25519), quando hai bisogno di una firma più ampia per una difesa in profondità, o quando lavori su hardware a 64 bit dove SHA-512 è effettivamente più veloce di SHA-256. Per la maggior parte delle applicazioni web, la firma delle API e la verifica dei webhook, HMAC-SHA256 fornisce sicurezza sufficiente ed è la scelta più comune negli ecosistemi.