Який алгоритм автентифікації використовується для приватних кінцевих точок?

Останнє оновлення: 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 = Пароніми/пари значень nonce та параметрів методу API, закодовані у формі.

Приклади змінних для виклику методу TradeBalance наведені нижче (зверніть увагу, що всі значення є рядковими значеннями, незалежно від того, що вони представляють):

  • Шлях URI = "/0/private/TradeBalance"

  • nonce = "1540973848000"

  • Дані POST = "nonce=1540973848000&asset=xbt"

Алгоритм

  • Обчисліть SHA256 значення nonce та POST-даних.

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

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

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

Приклад алгоритму з використанням наведених вище змінних:

  • Base64Encode(HMAC-SHA512 of ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")) using Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") as the HMAC key

Результатом є значення 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;

Потрібна додаткова допомога?