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;
    if (key.length > blockSize) {
        paddedKey = sha256(key);
    }
    while (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);

    return hmac;
}

// В реалните библиотеки реализацията е оптимизирана и се различава

Ключовата разлика от простото хеширане с ключ (hash(ключ + съобщение) или hash(съобщение + ключ)) е, че HMAC е устойчив на атаки за удължаване на съобщения, тъй като използва две фази на хеширане с различни константи за padding.