Sobes.tech
Middle

Šta je HMAC i kako se koristi?

sobes.tech АИ

Одговор од АИ

HMAC (Hash-based Message Authentication Code) je mehanizam za proveru integriteta i autentičnosti poruke koristeći tajni ključ i kriptografski hash funkciju.

Algoritam rada:

  1. Formiranje unutrašnjeg i spoljnjeg ključa od tajnog ključa i konstanti (ipad, opad).
  2. Izračunavanje unutrašnjeg hasha: hash(tajni ključ XOR ipad + poruka).
  3. Izračunavanje spoljnjeg hasha: hash(tajni ključ XOR opad + unutrašnji hash). To je HMAC.

Upotreba:

  • Autentifikacija API zahteva: Server i klijent dele zajednički tajni ključ. Klijent računa HMAC za podatke zahteva i šalje ga u zaglavlju. Server računa isti HMAC sa istim podacima i ključem i ga upoređuje sa poslatom vrednošću. Ako se poklapaju, zahtev se smatra autentičnim.
  • Provera integriteta podataka: Ako HMAC poruke odgovara ponovo izračunatom HMAC-u, može se biti siguran da podaci nisu menjani tokom prenosa.
  • Korišćenje u JSON Web Tokens (JWT): HMAC se često koristi kao algoritam digitalnog potpisa (HS256, HS384, HS512) za obezbeđivanje integriteta podataka tokena.

Primer implementacije (pseudokod):

function hmacSHA256(key, message) {
    // Konstantne padding-a
    const blockSize = 64; // za SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Priprema ključa
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Unutrašnji hash
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Spoljašnji hash (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    return hmac;
}

// U pravim bibliotekama, implementacija je optimizovana i razlikuje se

Ključna razlika od jednostavnog hash-a sa ključem (hash(ključ + poruka) ili hash(poruka + ključ)) je u tome što je HMAC otporan na napade produženja poruka, jer koristi dve faze hashiranja sa različitim konstantama padding-a.