Sobes.tech
Middle

Ի՞նչ է HMAC-ը և ինչպես է այն օգտագործվում:

sobes.tech AI

Պատասխան AI-ից

HMAC (Hash-based Message Authentication Code) — սա մեխանիզմ է հաղորդագրության ամբողջականությունն ու իսկությունը ստուգելու համար՝ օգտագործելով գաղտնի բանալի և կրիպտոգրաֆիկ հեշ-ֆունկցիա:

Աշխատանքի ալգորիթմը:

  1. Գաղտնի բանալիից ձևավորում է ներքին և արտաքին բանալիներ (ipad, opad):
  2. Հաշվարկ է կատարվում ներքին հեշը՝ hash(գաղտնի բանալի XOR ipad + հաղորդագրություն):
  3. Արտաքին հեշը՝ hash(գաղտնի բանալի XOR opad + ներքին հեշ)։ Սա է HMAC-ը:

Օգտագործում:

  • API հարցումների նույնականացում: Սերվերը և հաճախորդը ունեն ընդհանուր գաղտնի բանալի։ Հաճախորդը հաշվում է HMAC տվյալների համար և ուղարկում այն հղում։ Սերվերը նույն տվյալների և բանալիով հաշվում է HMAC-ը և համեմատում ուղարկված արժեքի հետ։ Եթե համընկնում է, հարցումը համարվում է իսկական։
  • Տվյալների ամբողջականության ստուգում: Եթե հաղորդագրության HMAC-ը համընկնում է կրկնակի հաշվարկված HMAC-ի հետ, կարող եք վստահ լինել, որ տվյալները չեն փոխվել փոխանցման ժամանակ:
  • JSON Web Tokens (JWT)-ում օգտագործում: HMAC-ը հաճախ կիրառվում է թվային ստորագրության ալգորիթմ (HS256, HS384, HS512)՝ տվյալների ամբողջականությունը ապահովելու համար:

Նմուշ կոդ՝ պսևդոկոդ:

function hmacSHA256(key, message) {
    // padding կոնստրուկցիաներ
    const blockSize = 64; // SHA-256-ի համար
    const ipad = 0x36;
    const opad = 0x5c;

    // Բանալի պատրաստում
    let paddedKey = key;
    եթե (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    մինչ (paddedKey.length < blockSize) {
        paddedKey += 0x00;
    }

    // Ներքին հեշ
    const innerPaddedKey = xor(paddedKey, ipad);
    const innerHash = sha256(innerPaddedKey + message);

    // Արտաքին հեշ (HMAC)
    const outerPaddedKey = xor(paddedKey, opad);
    const hmac = sha256(outerPaddedKey + innerHash);

    վերադարձնել hmac;
}

// Իրական գրադարաններում իրականացմանը տարբերվում է և օպտիմիզացված է

Հիմնական տարբերությունը պարզ հեշից՝ hash(կողմից + հաղորդագրություն) կամ hash(հաղորդագրությունից + կողմ) օգտագործելու հետ այն է, որ HMAC-ը դիմացկուն է հաղորդագրության երկարացման հարձակումներին, քանի որ օգտագործում է երկու փուլ հեշավորում՝ տարբեր padding կոնստրուկցիաներով։