HMAC-SHA256 per l'integrità dei messaggi
Crei e verifichi firme HMAC-SHA256 per garantire l'integrità dei payload delle API.
HMAC-SHA256 per l'integrità dei messaggi è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Che cos'è HMAC?
HMAC (codice di autenticazione dei messaggi basato su hash) combina una funzione di hash crittografica con una chiave segreta per produrre un MAC. Dimostra sia che i dati non sono stati manomessi sia che il mittente conosce la chiave segreta.
HMAC e hash semplice
Un semplice hash SHA-256 può essere calcolato da chiunque. HMAC richiede la chiave segreta: solo le parti che la conoscono possono creare o verificare un HMAC valido. Gli hash semplici garantiscono l'integrità, ma non l'autenticazione.
Calcolo di HMAC-SHA256 in Java
Utilizzi Mac.getInstance("HmacSHA256"), inizializzandolo con un SecretKeySpec, quindi chiami doFinal(data).
byte[] keyBytes = "my-secret-key".getBytes(StandardCharsets.UTF_8);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
byte[] hmac = mac.doFinal("payload data".getBytes(StandardCharsets.UTF_8));
String hmacHex = HexFormat.of().formatHex(hmac);
System.out.println(hmacHex); // 64-char hexVerifica di un HMAC
Ricalcoli l'HMAC sui dati ricevuti usando la chiave condivisa. Utilizzi un confronto a tempo costante (MessageDigest.isEqual) per prevenire gli attacchi basati sul tempo.
byte[] expectedHmac = computeHmac(key, receivedPayload);
byte[] actualHmac = HexFormat.of().parseHex(receivedHmacHex);
boolean valid = MessageDigest.isEqual(expectedHmac, actualHmac);
if (!valid) throw new SecurityException("HMAC verification failed — data tampered!");Generazione di una chiave sicura
Le chiavi HMAC devono essere byte casuali, non password. Utilizzi KeyGenerator o SecureRandom per generare una chiave da 256 bit.
KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());Firma delle richieste API con HMAC
Calcoli l'HMAC sul metodo HTTP, sul percorso, sul timestamp e sul corpo. Includa l'HMAC nell'header X-Signature. Il server lo ricalcola e lo confronta per verificare che la richiesta non sia stata manomessa.
String payload = method + "\n" + path + "\n" + timestamp + "\n" + body;
byte[] hmac = computeHmac(apiSecretKey, payload);
request.header("X-Signature", "hmac-sha256=" + HexFormat.of().formatHex(hmac));
request.header("X-Timestamp", timestamp);Prevenzione degli attacchi di replay
Un attaccante può riprodurre una richiesta firmata valida. Includa un timestamp nel payload firmato e rifiuti le richieste più vecchie di alcuni minuti.
long timestamp = Long.parseLong(request.getHeader("X-Timestamp"));
if (Math.abs(System.currentTimeMillis() / 1000 - timestamp) > 300) {
throw new SecurityException("Request too old — possible replay attack");
}Verifica dei webhook con HMAC
GitHub, Stripe e molti servizi firmano i webhook con HMAC. Verifichi l'header X-Hub-Signature-256 per assicurarsi che il webhook provenga dal servizio e non sia stato modificato.
// GitHub webhook verification:
String received = request.getHeader("X-Hub-Signature-256").replace("sha256=","");
byte[] expected = computeHmac(webhookSecret, request.getBody());
boolean valid = MessageDigest.isEqual(expected, HexFormat.of().parseHex(received));HMAC nei JWT
HS256 (HMAC-SHA256) è un algoritmo comune per la firma dei JWT. L'header+payload viene firmato con un segreto condiviso. Sia l'emittente sia il verificatore devono conoscere il segreto: è adatto ai microservizi all'interno dello stesso perimetro di fiducia.
Rotazione delle chiavi HMAC
Ruoti periodicamente le chiavi HMAC. Durante la rotazione, accetti gli HMAC generati sia con la chiave precedente sia con quella nuova per un breve periodo di sovrapposizione, quindi dismetta la chiave precedente.
Quando usare HMAC o le firme digitali
HMAC: simmetrico — entrambe le parti condividono il segreto, è veloce ed è adatto alle API interne e alla verifica dei webhook. Firme digitali (RSA/ECDSA): asimmetriche — solo il firmatario possiede la chiave privata, mentre chiunque disponga della chiave pubblica può verificarle; sono adatte ai JWT nei sistemi distribuiti.
Verifica rapida
Perché il confronto HMAC deve usare un confronto a tempo costante?
Riepilogo
HMAC-SHA256 fornisce integrità autenticata: dimostra l'origine dei dati e l'assenza di manomissioni. Utilizzi Mac.getInstance("HmacSHA256"). Utilizzi sempre un confronto a tempo costante. Includa i timestamp per prevenire gli attacchi di replay. Lo utilizzi per la firma delle API, la verifica dei webhook e i JWT HS256.
Domande Frequenti
La lezione «HMAC-SHA256 per l'integrità dei messaggi» è gratuita?
Sì — il testo completo di «HMAC-SHA256 per l'integrità dei messaggi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «HMAC-SHA256 per l'integrità dei messaggi»?
Crei e verifichi firme HMAC-SHA256 per garantire l'integrità dei payload delle API. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «HMAC-SHA256 per l'integrità dei messaggi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Hash crittografico con MessageDigest
- Crittografia simmetrica AES
- HMAC-SHA256 per l'integrità dei messaggi
- JWT: struttura, creazione e verifica