Sobes.tech
Middle

Kas yra HMAC ir kaip jis naudojamas?

sobes.tech AI

Atsakymas iš AI

HMAC (Hash-based Message Authentication Code) — tai mechanizmas, skirtas pranešimo vientisumui ir autentiškumui patikrinti, naudojant slaptažodį raktą ir kriptografinę maišos funkciją.

Veikimo algoritmas:

  1. Vidinis ir išorinis raktai sudaromi iš slaptažodžio rakto (ipad, opad konstanta).
  2. Apskaičiuojamas vidinis maišas: hash(slaptažodžio raktas XOR ipad + pranešimas).
  3. Apskaičiuojamas išorinis maišas: hash(slaptažodžio raktas XOR opad + vidinis maišas). Tai yra HMAC.

Naudojimas:

  • API užklausų autentifikavimas: Serveris ir klientas turi bendrą slaptažodį raktą. Klientas apskaičiuoja HMAC duomenims ir siunčia jį antraštėje. Serveris apskaičiuoja tą patį HMAC ir palygina. Jei sutampa, užklausa laikoma autentiška.
  • Duomenų vientisumo patikra: Jei pranešimo HMAC sutampa su pakartotinai apskaičiuotu HMAC, galima būti tikriems, kad duomenys nebuvo pakeisti perdavimo metu.
  • Naudojimas JSON Web Tokens (JWT): HMAC dažnai naudojamas kaip skaitmeninio parašo algoritmas (HS256, HS384, HS512), siekiant užtikrinti duomenų vientisumą.

Pavyzdinis įgyvendinimas (pseudokodas):

function hmacSHA256(raktas, pranešimas) {
    // užpildymo konstantos
    const blockSize = 64; // SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Raktų paruošimas
    let paddedKey = raktas;
    jei (raktas.length > blockSize) {
        paddedKey = sha256(raktas);
    }
    kol (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Vidinis maišas
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + pranešimas);

    // Išorinis maišas (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    grąžinti hmac;
}

// Tikrose bibliotekose įgyvendinimas yra optimizuotas ir skiriasi

Pagrindinis skirtumas nuo paprasto maišos su raktu (hash(raktas + pranešimas) arba hash(pranešimas + raktas)) tas, kad HMAC yra atsparus prailginimo atakoms, nes naudoja dvi maišos fazes su skirtingais užpildymo konstančiais.