Sobes.tech
Middle

Mi az a HMAC és hogyan használják?

sobes.tech MI

Válasz az MI-től

HMAC (Hash-alapú Üzenet Hitelesítési Kód) egy mechanizmus az üzenet integritásának és hitelességének ellenőrzésére, titkos kulcs és kriptográfiai hash függvény használatával.

Működési algoritmus:

  1. Belső és külső kulcsok kialakítása a titkos kulcsból és állandókból (ipad, opad).
  2. Belső hash számítása: hash(titkos kulcs XOR ipad + üzenet).
  3. Külső hash számítása: hash(titkos kulcs XOR opad + belső hash). Ez az HMAC.

Felhasználási területek:

  • API kérések hitelesítése: A szerver és a kliens közös titkos kulcsot oszt meg. A kliens kiszámítja az HMAC-et a kérés adataira, és elküldi a fejlécben. A szerver ugyanazzal az adatokkal és kulccsal kiszámítja az HMAC-et, és összehasonlítja a küldött értékkel. Ha egyeznek, a kérés hitelesnek tekinthető.
  • Adatok integritásának ellenőrzése: Ha az üzenet HMAC-e megegyezik a újraszámított HMAC-mel, akkor biztos lehet benne, hogy az adatok nem változtak a továbbítás során.
  • Használat JSON Web Tokenekben (JWT): Az HMAC gyakran alkalmazott digitális aláírásként (HS256, HS384, HS512), az adatok integritásának biztosítására.

Implementációs példa (pseudokód):

function hmacSHA256(key, message) {
    // Padding állandók
    const blockSize = 64; // SHA-256-hoz
    const ipad = 0x36;
    const opad = 0x5c;

    // Kulcs előkészítése
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Belső hash
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Külső hash (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    return hmac;
}

// Valós könyvtárakban az implementáció optimalizált és eltérő

A fő különbség a sima kulccsal történő hash (hash(kulcs + üzenet) vagy hash(üzenet + kulcs)) között az, hogy az HMAC ellenáll a hosszabbításos támadásoknak, mivel két hash-fázist használ különböző padding konstansokkal.