Гайд10 мин чтения

HMAC-SHA256: Как подписывать запросы к API

Команда KeyForDEX·

HMAC — это механизм, который позволяет серверу убедиться, что запрос пришел именно от вас и не был изменен по пути. Это фундаментальный аспект безопасности при работе с приватными эндпоинтами API.

Что такое HMAC и зачем он нужен?

Представьте, что вы отправляете гонца с приказом. Чтобы получатель был уверен, что приказ от вас и его не подменили, вы ставите на него свою уникальную восковую печать. HMAC (Hash-based Message Authentication Code) — это и есть такая цифровая "печать".

Она решает две задачи:

  • Аутентификация: Доказывает, что запрос пришел от владельца API-ключа (только у вас есть секретный ключ - "печать").
  • Целостность: Гарантирует, что данные запроса (например, сумма ордера) не были изменены злоумышленником во время передачи.

В отличие от простого хеширования, HMAC использует секретный ключ, который известен только вам и серверу, что делает подделку подписи практически невозможной.

Пошаговый алгоритм создания подписи

Процесс создания подписи для API, использующих HMAC-SHA256 (как на AsterDEX, Binance и многих других), практически идентичен:

  1. Сборка строки для подписи (Query String): Вы собираете все параметры вашего запроса в одну строку. Порядок параметров важен! Например: symbol=BTCUSDT&side=BUY&type=LIMIT&quantity=1&price=30000×tamp=1672531200000.
  2. Хеширование: Вы берете эту строку и хешируете ее с помощью алгоритма HMAC-SHA256, используя ваш Secret Key в качестве ключа для хеширования.
  3. Кодирование: Результат хеширования (бинарные данные) преобразуется в шестнадцатеричную строку (hex). Это и есть ваша signature.
  4. Отправка запроса: Вы добавляете полученную подпись как еще один параметр к вашему запросу (&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 в строжайшем секрете и никогда не передавать его по незащищенным каналам.