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 hexWeryfikowanie 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
- Haszowanie kryptograficzne za pomocą MessageDigest
- Szyfrowanie symetryczne AES
- HMAC-SHA256 na potrzeby integralności wiadomości
- JWT: struktura, tworzenie i weryfikacja