HMAC — это механизм, который позволяет серверу убедиться, что запрос пришел именно от вас и не был изменен по пути. Это фундаментальный аспект безопасности при работе с приватными эндпоинтами API.
Что такое HMAC и зачем он нужен?
Представьте, что вы отправляете гонца с приказом. Чтобы получатель был уверен, что приказ от вас и его не подменили, вы ставите на него свою уникальную восковую печать. HMAC (Hash-based Message Authentication Code) — это и есть такая цифровая "печать".
Она решает две задачи:
- Аутентификация: Доказывает, что запрос пришел от владельца API-ключа (только у вас есть секретный ключ - "печать").
- Целостность: Гарантирует, что данные запроса (например, сумма ордера) не были изменены злоумышленником во время передачи.
В отличие от простого хеширования, HMAC использует секретный ключ, который известен только вам и серверу, что делает подделку подписи практически невозможной.
Пошаговый алгоритм создания подписи
Процесс создания подписи для API, использующих HMAC-SHA256 (как на AsterDEX, Binance и многих других), практически идентичен:
- Сборка строки для подписи (Query String): Вы собираете все параметры вашего запроса в одну строку. Порядок параметров важен! Например:
symbol=BTCUSDT&side=BUY&type=LIMIT&quantity=1&price=30000×tamp=1672531200000. - Хеширование: Вы берете эту строку и хешируете ее с помощью алгоритма HMAC-SHA256, используя ваш Secret Key в качестве ключа для хеширования.
- Кодирование: Результат хеширования (бинарные данные) преобразуется в шестнадцатеричную строку (hex). Это и есть ваша
signature. - Отправка запроса: Вы добавляете полученную подпись как еще один параметр к вашему запросу (
&signature=...) и отправляете его на сервер, не забыв указать ваш API Key в заголовкеX-MBX-APIKEY.
Пример на Python
Python идеально подходит для этой задачи благодаря встроенным библиотекам hashlib и hmac.
import hmac
import hashlib
import time
# Ваши ключи (НИКОГДА не храните их в коде в открытом виде!)
apiKey = "your_api_key"
secretKey = "your_secret_key"
# 1. Параметры запроса
params = {
'symbol': 'BTCUSDT',
'side': 'BUY',
'type': 'LIMIT',
'timeInForce': 'GTC',
'quantity': 0.001,
'price': 30000,
'timestamp': int(time.time() * 1000)
}
# Сборка строки для подписи
query_string = '&'.join([f"{key}={value}" for key, value in params.items()])
# 2. Создание подписи
signature = hmac.new(
secretKey.encode('utf-8'),
query_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
print(f"Query String: {query_string}")
print(f"Signature: {signature}")
# 3. Итоговый URL для запроса
# final_url = f"https://api.binance.com/api/v3/order?{query_string}&signature={signature}"
# headers = {'X-MBX-APIKEY': apiKey}
# ... дальше идет отправка запроса с помощью requests ...
Пример на JavaScript (Node.js)
В Node.js для этого используется встроенный модуль crypto.
const crypto = require('crypto');
// Ваши ключи
const apiKey = 'your_api_key';
const secretKey = 'your_secret_key';
// 1. Параметры запроса
const params = {
symbol: 'BTCUSDT',
side: 'BUY',
type: 'LIMIT',
timeInForce: 'GTC',
quantity: 0.001,
price: 30000,
timestamp: Date.now()
};
const queryString = Object.entries(params).map(([key, val]) => `${key}=${val}`).join('&');
// 2. Создание подписи
const signature = crypto
.createHmac('sha256', secretKey)
.update(queryString)
.digest('hex');
console.log(`Query String: ${queryString}`);
console.log(`Signature: ${signature}`);
// 3. Итоговый URL для запроса
// const finalUrl = `https://api.binance.com/api/v3/order?${queryString}&signature=${signature}`;
// const headers = { 'X-MBX-APIKEY': apiKey };
// ... дальше идет отправка запроса с помощью axios/fetch ...
Заключение
HMAC-аутентификация — это несложный, но критически важный механизм защиты. Поняв его один раз, вы сможете безопасно работать с API любой крупной биржи. Главное — всегда держать ваш Secret Key в строжайшем секрете и никогда не передавать его по незащищенным каналам.