Java Academy · Lektion

HMAC-SHA256 för meddelandeintegritet

Skapa och verifiera HMAC-SHA256-signaturer för att säkerställa integriteten hos API-laster.

Lektion 3 av 413 steg

HMAC-SHA256 för meddelandeintegritet är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad är HMAC

HMAC (hashbaserad meddelandeautentiseringskod) kombinerar en kryptografisk hashfunktion med en hemlig nyckel för att skapa en MAC. Den bevisar både att data inte har manipulerats OCH att avsändaren känner till den hemliga nyckeln.

HMAC kontra vanlig hash

Vem som helst kan beräkna en vanlig SHA-256-hash. HMAC kräver den hemliga nyckeln – endast parter som känner till nyckeln kan skapa eller verifiera en giltig HMAC. Vanliga hashvärden ger integritet, men inte autentisering.

Beräkna HMAC-SHA256 i Java

Använd Mac.getInstance("HmacSHA256"), initiera med en SecretKeySpec och anropa 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 hex

Verifiera en HMAC

Beräkna HMAC på nytt för mottagna data med den delade nyckeln. Använd en jämförelse i konstant tid (MessageDigest.isEqual) för att förhindra timingattacker.

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!");

Generera en säker nyckel

HMAC-nycklar bör bestå av slumpmässiga byte, inte lösenord. Använd KeyGenerator eller SecureRandom för att generera en 256-bitars nyckel.

KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());

HMAC för signering av API-anrop

Beräkna HMAC för HTTP-metoden, sökvägen, tidsstämpeln och brödtexten. Inkludera HMAC i headern X-Signature. Servern beräknar HMAC på nytt och jämför värdena för att verifiera att begäran inte har manipulerats.

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);

Förhindra replayattacker

En angripare kan spela upp en giltigt signerad begäran på nytt. Inkludera en tidsstämpel i det signerade innehållet och avvisa begäranden som är äldre än några minuter.

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");
}

HMAC för verifiering av webhookar

GitHub, Stripe och många andra tjänster signerar webhookar med HMAC. Verifiera headern X-Hub-Signature-256 för att säkerställa att webhooken kom från tjänsten och inte har ändrats.

// 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 i JWT

HS256 (HMAC-SHA256) är en vanlig signaturalgoritm för JWT. Headern och payloaden signeras med en delad hemlighet. Både utfärdaren och verifieraren måste känna till hemligheten – lämpligt för mikrotjänster inom samma förtroendegräns.

Rotation av HMAC-nycklar

Rotera HMAC-nycklar regelbundet. Under rotationen accepterar ni HMAC-värden från både den gamla och den nya nyckeln under en kort överlappningsperiod och fasar sedan ut den gamla nyckeln.

När ska HMAC användas i stället för digitala signaturer

HMAC: symmetriskt – båda sidor delar hemligheten, snabbt och lämpligt för interna API:er och verifiering av webhookar. Digitala signaturer (RSA/ECDSA): asymmetriska – endast signeraren har den privata nyckeln, och alla som har den publika nyckeln kan verifiera signaturen, vilket passar JWT:er i distribuerade system.

Snabbkontroll

Varför måste HMAC-jämförelser använda en jämförelse i konstant tid?

Sammanfattning

HMAC-SHA256 ger integritet med autentisering – det bevisar dataursprung och att data inte har manipulerats. Använd Mac.getInstance("HmacSHA256"). Använd alltid en jämförelse i konstant tid. Inkludera tidsstämplar för att förhindra replayattacker. Använd HMAC för API-signering, verifiering av webhookar och HS256-JWT:er.

Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”HMAC-SHA256 för meddelandeintegritet” gratis?

Ja – hela texten till ”HMAC-SHA256 för meddelandeintegritet” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”HMAC-SHA256 för meddelandeintegritet”?

Skapa och verifiera HMAC-SHA256-signaturer för att säkerställa integriteten hos API-laster. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”HMAC-SHA256 för meddelandeintegritet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Kryptografisk hashning med MessageDigest
  2. Symmetrisk AES-kryptering
  3. HMAC-SHA256 för meddelandeintegritet
  4. JWT: struktur, skapande och verifiering
← Tillbaka till Java Academy