Middle
Czym jest HMAC i jak jest używany?
sobes.tech AI
Odpowiedź od AI
HMAC (Hash-based Message Authentication Code) to mechanizm służący do sprawdzania integralności i autentyczności wiadomości za pomocą tajnego klucza i kryptograficznej funkcji hash.
Algorytm działania:
- Tworzenie kluczy wewnętrznych i zewnętrznych z tajnego klucza i stałych (
ipad,opad). - Obliczanie wewnętrznego hasha:
hash(tajny klucz XOR ipad + wiadomość). - Obliczanie zewnętrznego hasha:
hash(tajny klucz XOR opad + wewnętrzny hash). To jest HMAC.
Zastosowania:
- Uwierzytelnianie żądań API: Serwer i klient mają wspólny tajny klucz. Klient oblicza HMAC dla danych żądania i wysyła go w nagłówku. Serwer oblicza HMAC z tymi samymi danymi i kluczem, porównując z przesłaną wartością. Jeśli się zgadzają, żądanie jest uznawane za autentyczne.
- Sprawdzanie integralności danych: Jeśli HMAC wiadomości zgadza się z ponownie obliczonym HMAC, można być pewnym, że dane nie zostały zmienione podczas transmisji.
- Użycie w JSON Web Tokens (JWT): HMAC często stosuje się jako algorytm podpisu cyfrowego (HS256, HS384, HS512) w celu zapewnienia integralności danych tokena.
Przykład implementacji (pseudokod):
function hmacSHA256(key, message) {
// Stałe paddingu
const blockSize = 64; // dla SHA-256
const ipad = 0x36;
const opad = 0x5c;
// Przygotowanie klucza
let paddedKey = key;
if (key.length > blockSize) {
paddedKey = sha256(key);
}
while (paddedKey.length < blockSize) {
paddedKey += 0x00;
}
// Wewnętrzny hash
const innerPaddedKey = xor(paddedKey, ipad);
const innerHash = sha256(innerPaddedKey + message);
// Zewnętrzny hash (HMAC)
const outerPaddedKey = xor(paddedKey, opad);
const hmac = sha256(outerPaddedKey + innerHash);
return hmac;
}
// W rzeczywistych bibliotekach implementacja jest zoptymalizowana i różni się
Kluczowa różnica od prostego haszowania z kluczem (hash(klucz + wiadomość) lub hash(wiadomość + klucz)) polega na tym, że HMAC jest odporny na ataki typu extension attack, ponieważ używa dwóch faz haszowania z różnymi stałymi paddingu.