0Pricing
Java Academy · Lekcja

HMAC-SHA256 na potrzeby integralności wiadomości

Proszę tworzyć i weryfikować podpisy HMAC-SHA256, aby zapewnić integralność danych przesyłanych przez API.

HMAC-SHA256 na potrzeby integralności wiadomości to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest HMAC?

HMAC (kod uwierzytelniania wiadomości oparty na funkcji skrótu) łączy kryptograficzną funkcję skrótu z tajnym kluczem, aby utworzyć kod MAC. Dowodzi zarówno, że dane nie zostały zmodyfikowane, jak i że nadawca zna tajny klucz.

HMAC a zwykły skrót

Zwykły skrót SHA-256 może obliczyć każdy. HMAC wymaga tajnego klucza — tylko strony, które go znają, mogą utworzyć lub zweryfikować prawidłowy HMAC. Zwykłe skróty zapewniają integralność, ale nie uwierzytelnianie.

Obliczanie HMAC-SHA256 w Javie

Należy użyć Mac.getInstance("HmacSHA256"), zainicjalizować obiekt za pomocą SecretKeySpec, a następnie wywołać 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

Weryfikowanie HMAC

Należy ponownie obliczyć HMAC dla odebranych danych przy użyciu współdzielonego klucza. Aby zapobiec atakom czasowym, należy zastosować porównanie w czasie stałym (MessageDigest.isEqual).

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

Generowanie bezpiecznego klucza

Klucze HMAC powinny składać się z losowych bajtów, a nie z haseł. Do wygenerowania 256-bitowego klucza należy użyć KeyGenerator lub SecureRandom.

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

HMAC do podpisywania żądań API

Należy obliczyć HMAC na podstawie metody HTTP, ścieżki, znacznika czasu i treści żądania. HMAC należy umieścić w nagłówku X-Signature. Serwer ponownie go oblicza i porównuje, aby sprawdzić, czy żądanie nie zostało zmodyfikowane.

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

Zapobieganie atakom powtórzeniowym

Atakujący może ponownie wysłać prawidłowo podpisane żądanie. W podpisywanym ładunku należy umieścić znacznik czasu i odrzucać żądania starsze niż kilka minut.

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 do weryfikacji webhooków

GitHub, Stripe i wiele innych usług podpisuje webhooki za pomocą HMAC. Należy zweryfikować nagłówek X-Hub-Signature-256, aby upewnić się, że webhook pochodzi z danej usługi i nie został zmodyfikowany.

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

HS256 (HMAC-SHA256) to popularny algorytm podpisu JWT. Nagłówek i payload są podpisywane za pomocą współdzielonego sekretu. Zarówno wystawca, jak i weryfikator muszą znać sekret — rozwiązanie to nadaje się do mikroserwisów znajdujących się w tej samej granicy zaufania.

Rotacja kluczy HMAC

Klucze HMAC należy okresowo rotować. Podczas rotacji przez krótki okres przejściowy należy akceptować HMAC-y utworzone zarówno za pomocą starego, jak i nowego klucza, a następnie wycofać stary klucz.

Kiedy używać HMAC, a kiedy podpisów cyfrowych

HMAC: symetryczny — obie strony współdzielą sekret, rozwiązanie jest szybkie i nadaje się do wewnętrznych API oraz weryfikacji webhooków. Podpisy cyfrowe (RSA/ECDSA): asymetryczne — tylko podpisujący ma klucz prywatny, a podpis może zweryfikować każdy, kto ma klucz publiczny; rozwiązanie to nadaje się do JWT w systemach rozproszonych.

Szybkie sprawdzenie

Dlaczego HMAC należy porównywać w czasie stałym?

Podsumowanie

HMAC-SHA256 zapewnia uwierzytelnioną integralność — potwierdza pochodzenie danych i brak ich modyfikacji. Należy używać Mac.getInstance("HmacSHA256"). Zawsze trzeba stosować porównanie w czasie stałym. Aby zapobiegać atakom powtórzeniowym, należy uwzględniać znaczniki czasu. HMAC nadaje się do podpisywania żądań API, weryfikacji webhooków i tokenów JWT HS256.

Często zadawane pytania

Czy lekcja „HMAC-SHA256 na potrzeby integralności wiadomości” jest bezpłatna?

Tak — pełny tekst „HMAC-SHA256 na potrzeby integralności wiadomości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „HMAC-SHA256 na potrzeby integralności wiadomości”?

Proszę tworzyć i weryfikować podpisy HMAC-SHA256, aby zapewnić integralność danych przesyłanych przez API. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „HMAC-SHA256 na potrzeby integralności wiadomości”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Haszowanie kryptograficzne za pomocą MessageDigest
  2. Szyfrowanie symetryczne AES
  3. HMAC-SHA256 na potrzeby integralności wiadomości
  4. JWT: struktura, tworzenie i weryfikacja
← Powrót do Java Academy