Sobes.tech
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:

  1. Tworzenie kluczy wewnętrznych i zewnętrznych z tajnego klucza i stałych (ipad, opad).
  2. Obliczanie wewnętrznego hasha: hash(tajny klucz XOR ipad + wiadomość).
  3. 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.