Что такое алгоритм аутентификации для приватных конечных точек?

Последнее обновление: 1 апр. 2025 г.

Аутентификация API требуется всякий раз, когда вызов API обращается к учетной записи с помощью одного из частных методов API.

Например, методы управления учетной записью, такие как Balance, TradeBalance и OpenOrders; методы торговли AddOrder и CancelOrder; и методы пополнения/вывода средств, такие как DepositAddresses и WithdrawInfo, являются частными методами API, которые требуют аутентификации API.

Ключи API и криптографические подписи

Аутентификация API основана на паре открытого/закрытого ключей (совместно именуемых ключом API) и криптографической подписи с использованием алгоритмов хеширования, таких как SHA256 и HMAC SHA512.

Пример ключа API будет состоять из открытого и закрытого ключей, аналогичных следующим:

bash

Bash

Public Key: CJbfPw4tnbf/9en/ZmpewCTKEwmmzO18LXZcHQcu7HPLWre4l8+V9I3y
 
 Private Key: FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==

Обратите внимание, что эти примеры нельзя использовать, так как они не связаны ни с одной учетной записью Kraken.

Криптографические подписи создаются в реальном времени кодом клиента API. Данные для вызова API проходят через ряд алгоритмов хеширования и аутентификации сообщений, которые безопасно подписывают данные с использованием секрета API (закрытой части ключа API).

HTTP-заголовки

Ключ API и подпись предоставляются API через пользовательские HTTP-заголовки API-Key и API-Sign.

Ключ API используется для идентификации учетной записи, к которой осуществляется доступ, поэтому значение ключа идентично для каждого вызова API. Криптографическая подпись используется для аутентификации вызова API и рассчитывается с использованием переменных значений (таких как nonce), поэтому значение подписи отличается для каждого вызова API.

Примеры HTTP-заголовков API-Key и API-Sign приведены ниже:

  • API-Key: CJbfPw4tnbf/9en/ZmpewCTKEwmmzO18LXZcHQcu7HPLWre4l8+V9I3y

  • API-Sign: RdQzoXRC83TPmbERpFj0XFVArq0Hfadm0eLolmXTuN2R24hzIqtAnF/f7vSfW1tGt7xQOn8bjm+Ht+X0KrMwlA==

Обратите внимание, что значение API-Key точно такое же, как показанный выше открытый ключ, но значение API-Sign (подпись) отличается от показанного выше закрытого ключа и будет меняться для каждого вызова API.

Псевдокод подписи

Наша документация API утверждает, что значение API-Sign представляет собой "подпись сообщения с использованием HMAC-SHA512 от (путь URI + SHA256(nonce + данные POST)) и секретного ключа API, декодированного из base64", которое можно разделить на несколько отдельных частей следующим образом:

Переменные

  • Путь URI = URL вызова API без 'https://api.kraken.com'.

  • nonce = Уникальный идентификатор, значение которого должно увеличиваться с каждым вызовом API (часто это метка времени UNIX, которая представляет собой текущее время в секундах (или миллисекундах для более высокого разрешения) с 1 января 1970 года).

  • POST data = Пары имя/значение nonce и параметров метода API, закодированные в формате формы.

Примеры переменных для вызова метода TradeBalance приведены ниже (обратите внимание, что все значения являются строковыми, независимо от того, что они представляют):

  • Путь URI = "/0/private/TradeBalance"

  • nonce = "1540973848000"

  • POST data = "nonce=1540973848000&asset=xbt"

Алгоритм

  • Вычислите SHA256 для nonce и данных POST.

  • Декодируйте секрет API (приватную часть ключа API) из base64.

  • Вычислите HMAC пути URI и SHA256, используя SHA512 в качестве хеша HMAC и декодированный секрет API в качестве ключа HMAC.

  • Закодируйте HMAC в base64.

Пример алгоритма с использованием указанных выше переменных выглядит следующим образом:

  • Base64Encode(HMAC-SHA512 от ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")), используя Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") в качестве ключа HMAC)

Результатом является значение API-Sign.

Пример кода

Ниже приведены минимальные (без проверки ошибок), но полностью функциональные примеры генерации подписи аутентификации API для конечной точки API TradeBalance:

python

Python

# Import required Python libraries
import time
import base64
import hashlib
import hmac

# Decode API private key from base64 format displayed in account management
api_secret = base64.b64decode(
    "FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ=="
)

# Variables (API endpoint, nonce and HTTP POST data)
api_path = "/0/private/TradeBalance"
api_nonce = str(int(time.time() * 1000))
api_post = "nonce=" + api_nonce + "&asset=xbt"

# Cryptographic hash algorithms
api_sha256 = hashlib.sha256(api_nonce.encode('utf-8') + api_post.encode('utf-8'))
api_hmac = hmac.new(
    api_secret,
    api_path.encode('utf-8') + api_sha256.digest(),
    hashlib.sha512
)

# Encode signature into base64 format used in API-Sign value
api_signature = base64.b64encode(api_hmac.digest())

# API authentication signature for use in API-Sign HTTP header
print(api_signature.decode())


NodeJS

bash

Bash

// Import required NodeJS libraries
const crypto = require('crypto');

// Decode API private key from base64 format displayed in account management
const apiSecret = Buffer.from(
  'FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==',
  'base64'
);

// Variables (API endpoint, nonce and HTTP POST data)
const apiPath = '/0/private/TradeBalance';
const apiNonce = Date.now().toString();
const apiPost = `nonce=${apiNonce}&asset=xbt`;

// Cryptographic hash algorithms
const apiSha256 = crypto.createHash('sha256').update(`${apiNonce}${apiPost}`).digest();
const apiSha512 = crypto.createHmac('sha512', apiSecret).update(apiPath).update(apiSha256).digest();

// Encode signature into base64 format used in API-Sign value
const apiSignature = apiSha512.toString('base64');

// API authentication signature for use in API-Sign HTTP header
console.log(apiSignature);


PHP

bash

Bash

// Decode API private key from base64 format displayed in account management
$apiSecret = base64_decode('FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==');

// Variables (API endpoint, nonce and HTTP POST data)
$apiPath = '/0/private/TradeBalance';
$apiNonce = explode(' ', microtime());
$apiNonce = $apiNonce[1] . substr($apiNonce[0], 2, 3);
$apiPost = "nonce={$apiNonce}&asset=xbt";

// Cryptographic hash algorithms
$apiSha256 = hash('sha256', $apiNonce . $apiPost, true);
$apiSha512 = hash_hmac('sha512', $apiPath . $apiSha256, $apiSecret, true);

// Encode signature into base64 format used in API-Sign value
$apiSignature = base64_encode($apiSha512);

// API authentication signature for use in API-Sign HTTP header
print $apiSignature;

Нужна дополнительная помощь?