Middle
Ի՞նչ է HMAC-ը և ինչպես է այն օգտագործվում:
sobes.tech AI
Պատասխան AI-ից
HMAC (Hash-based Message Authentication Code) — սա մեխանիզմ է հաղորդագրության ամբողջականությունն ու իսկությունը ստուգելու համար՝ օգտագործելով գաղտնի բանալի և կրիպտոգրաֆիկ հեշ-ֆունկցիա:
Աշխատանքի ալգորիթմը:
- Գաղտնի բանալիից ձևավորում է ներքին և արտաքին բանալիներ (
ipad,opad): - Հաշվարկ է կատարվում ներքին հեշը՝
hash(գաղտնի բանալի XOR ipad + հաղորդագրություն): - Արտաքին հեշը՝
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 կոնստրուկցիաներով։