Sobes.tech
Middle

Čo je HMAC a ako sa používa?

sobes.tech AI

Odpoveď od AI

HMAC (Hash-based Message Authentication Code) je mechanizmus na overenie integrity a autenticity správy pomocou tajného kľúča a kryptografickej hash funkcie.

Algoritmus fungovania:

  1. Vytvorenie vnútorného a vonkajšieho kľúča z tajného kľúča a konštánt (ipad, opad).
  2. Výpočet vnútorného hashu: hash(tajný kľúč XOR ipad + správa).
  3. Výpočet vonkajšieho hashu: hash(tajný kľúč XOR opad + vnútorný hash). To je HMAC.

Použitie:

  • Autentifikácia API požiadaviek: Server a klient zdieľajú spoločný tajný kľúč. Klient vypočíta HMAC pre údaje požiadavky a odošle ho v hlavičke. Server vypočíta rovnaký HMAC s rovnakými údajmi a kľúčom a porovná ho s odoslanou hodnotou. Ak sa zhodujú, požiadavka je považovaná za autentickú.
  • Kontrola integrity dát: Ak HMAC správy zodpovedá znovu vypočítanému HMAC, môže sa byť istý, že dáta neboli počas prenosu zmenené.
  • Použitie v JSON Web Tokens (JWT): HMAC sa často používa ako algoritmus digitálneho podpisu (HS256, HS384, HS512) na zabezpečenie integrity dát tokenu.

Príklad implementácie (pseudokód):

function hmacSHA256(key, message) {
    // Konštanty paddingu
    const blockSize = 64; // pre SHA-256
    const ipad = 0x36;
    const opad = 0x5c;

    // Príprava kľúča
    let paddedKey = key;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Vnútorný hash
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

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

    return hmac;
}

// V skutočných knižniciach je implementácia optimalizovaná a odlišná

Hlavný rozdiel od jednoduchého hashovania s kľúčom (hash(kľúč + správa) alebo hash(správa + kľúč)) je, že HMAC je odolný voči útokom na predĺženie správ, pretože používa dve fázy hashovania s rôznymi konštantami paddingu.