Генератор на HMAC
Генерирайте HMAC (Hash-based Message Authentication Code) с помощта на SHA-256, SHA-384, SHA-512 или SHA-1 алгоритми с таен ключ
Вход
Изход
Прочети ме
Какво е HMAC?
HMAC (Hash-based Message Authentication Code) е криптографска техника, която комбинира тайния ключ с хеш функция, за да произведе уникален код за удостоверяване. За разлика от простото хеширане, HMAC гарантира както интегритета на данните, така и тяхната автентичност—проверявайки, че съобщението не е било променено и потвърждавайки самоличността на изпращача.
HMAC работи чрез обработка на съобщението чрез хеш функция (като SHA-256) два пъти, смесена с тайния ключ по специфичен начин. Този двойно-хеширащ подход го прави устойчив на атаки с удължаване на дължината, които засягат обикновените хеш функции.
Как работи HMAC?
Алгоритъмът HMAC следва следните стъпки:
- Подготовка на ключа: Ако тайният ключ е по-дълъг от размера на блока на хеша, той се хеширует първо. Ако е по-кратък, се попълва с нули.
- Вътрешен хеш: Ключът се XORва с вътрешна константа за попълване (ipad), след което се конкатенира със съобщението и се хеширует.
- Външен хеш: Ключът се XORва с външна константа за попълване (opad), след което се конкатенира с резултата от вътрешния хеш и се хеширует отново.
Формулата е: HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
Тази конструкция гарантира, че дори ако нападателят знае хеша на съобщението, той не може да подправи валиден HMAC без да знае тайния ключ.
Защо да използвам HMAC вместо обикновено хеширане?
| Функция | Обикновен хеш | HMAC |
|---|---|---|
| Интегритет на данните | ✓ | ✓ |
| Удостоверяване | ✗ | ✓ |
| Изисква тайния ключ | ✗ | ✓ |
| Защита срещу удължаване на дължина | ✗ | ✓ |
| Подходящ за API удостоверяване | ✗ | ✓ |
Обикновените хешове (MD5, SHA-256) само проверяват, че данните не са се променили. HMAC допълнително доказва, че съобщението е дошло от някой, който знае тайния ключ, което го прави съществено за безопасни комуникации.
Разбиране на хеш алгоритмите
| Алгоритъм | Размер на изхода | Ниво на сигурност | Производителност | Препоръка |
|---|---|---|---|---|
| SHA-1 | 160 бита (40 hex знака) | Слабо | Най-бързо | Само наследени системи |
| SHA-256 | 256 бита (64 hex знака) | Силно | Бързо | Препоръчана по подразбиране |
| SHA-384 | 384 бита (96 hex знака) | Много силно | Умерено | Нужди с висока сигурност |
| SHA-512 | 512 бита (128 hex знака) | Много силно | Умерено | Максимална сигурност |
SHA-256 предлага най-добрия баланс между сигурност и производителност за повечето приложения. SHA-1 е включен за съвместимост с наследени системи, но трябва да се избягва за нови реализации поради известни уязвимости.
Сравнение на формати на изхода
Шестнадесетичен: Използва знаци 0-9 и a-f. Произвежда по-дълъг низ, но е по-лесен за четене и отстраняване на грешки. Често срещан в API и логване.
Base64: Използва знаци A-Z, a-z, 0-9, + и /. Произвежда по-кратък низ (приблизително 33% по-кратък от шестнадесетичния). Често срещан в JWT токени и компактна предача на данни.
Пример за същия HMAC:
- Hex:
5d5d139563c95b5967b9bd9a8c9b8c8d8e8f9a9b9c9d9e9f0a0b0c0d0e0f1011 - Base64:
XV0TlWPJW1lnub2ajJuMjY6Pmpm9nZ6fCgsMDQ4PEQ==
Описание на инструмента
Този HMAC генератор създава криптографски кодове за удостоверяване, използвайки Web Crypto API за безопасно, клиентско изчисление. Въведете вашето съобщение и тайния ключ, за да генерирате моментално HMAC подписи с избор на хеш алгоритъм (SHA-1, SHA-256, SHA-384 или SHA-512) и формат на изхода (шестнадесетичен или base64).
Цялата обработка се извършва изцяло във вашия браузър—вашите тайни ключове и съобщения никога не се предават на никой сървър, което гарантира пълна поверителност и сигурност.
Примери
Пример 1: Подписване на API заявка
- Съобщение:
GET /api/users?timestamp=1704067200 - Тайния ключ:
my-api-secret-key-2024 - Алгоритъм: SHA-256
- Изход (Hex):
d090e24b18ee077bdeceacab17fb15ff8cf7868147b302dbcb1b11630465e817
Функции
- Множество хеш алгоритми: Поддръжка за SHA-1, SHA-256, SHA-384 и SHA-512 с визуални индикатори, показващи битова сила
- Двойни формати на изхода: Генериране на резултати в шестнадесетичен или Base64 кодиране според вашите изисквания
- Генериране в реално време: HMAC се актуализира моментално, докато пишете, без да е необходимо кликване на бутон
- Сигурност на клиентската страна: Всички криптографски операции се извършват локално, използвайки Web Crypto API—нищо не се изпраща на сървъри
- Защитен с парола вход: Полето на тайния ключ е маскирано по подразбиране, за да се предотврати подглеждане
Случаи на употреба
- API удостоверяване: Подпишете API заявки с HMAC, за да докажете автентичност на заявката и предотвратите манипулиране (използвано от AWS, Stripe и много други услуги)
- Проверка на webhook: Валидирайте, че входящите webhooks наистина произхождат от очаквания сервис (GitHub, Shopify, Twilio)
- Интегритет на съобщението: Гарантирайте, че съобщенията, предавани между системи, не са били променени по време на предаването
- Генериране на токени за сесия: Създавайте защитени идентификатори на сесия, които могат да бъдат проверени без справки в база данни
- Цифрови подписи за документи: Генерирайте проверяеми подписи за договори, споразумения или чувствителни документи, споделени между страни
Най-добри практики за сигурност
- Дължина на ключа: Използвайте тайни ключове поне толкова дълги, колкото е изходът на хеша (32 байта за SHA-256, 64 байта за SHA-512)
- Случайност на ключа: Генерирайте ключове, използвайки криптографски защитени генератори на случайни числа, не пароли
- Съхранение на ключа: Никога не кодирайте ключове в изходния код; използвайте променливи на окръжението или системи за управление на защитени ключове
- Избор на алгоритъм: Използвайте SHA-256 или по-силен; избягвайте SHA-1 за нови реализации
- Сравнение с постоянно време: При програмно проверяване на HMAC, използвайте функции за сравнение с постоянно време, за да предотвратите атаки по време
Често срещани HMAC реализации
JavaScript (Node.js):
const crypto = require("crypto");
const hmac = crypto
.createHmac("sha256", secretKey)
.update(message)
.digest("hex");Python:
import hmac
import hashlib
signature = hmac.new(secret_key.encode(), message.encode(), hashlib.sha256).hexdigest()PHP:
$signature = hash_hmac('sha256', $message, $secretKey);Свързани стандарти и спецификации
- RFC 2104: HMAC: Keyed-Hashing for Message Authentication
- FIPS 198-1: The Keyed-Hash Message Authentication Code (HMAC)
- RFC 4868: Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec