Jaki jest algorytm uwierzytelniania dla prywatnych punktów końcowych?

Ostatnia aktualizacja: 1 kwi 2025

Uwierzytelnianie API jest wymagane za każdym razem, gdy wywołanie API uzyskuje dostęp do konta za pośrednictwem jednej z prywatnych metod API.

Na przykład metody zarządzania kontem, takie jak Balance, TradeBalance i OpenOrders; metody handlowe AddOrder i CancelOrder; oraz metody finansowania, takie jak DepositAddresses i WithdrawInfo, to wszystkie prywatne metody API, które wymagałyby uwierzytelniania API.

Klucze API i podpisy kryptograficzne

Uwierzytelnianie API opiera się na parze kluczy publiczny/prywatny (łącznie znanych jako klucz API) oraz na podpisie kryptograficznym wykorzystującym algorytmy haszujące, takie jak SHA256 i HMAC SHA512.

Przykładowy klucz API składałby się z klucza publicznego i prywatnego, podobnych do następujących:

bash

Bash

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

Należy pamiętać, że te przykłady nie mogą być używane, ponieważ nie są powiązane z żadnym kontem Kraken.

Podpisy kryptograficzne są tworzone w czasie rzeczywistym przez kod klienta API. Dane dla wywołania API są przepuszczane przez serię algorytmów haszujących i uwierzytelniania wiadomości, które bezpiecznie podpisują dane za pomocą tajnego klucza API (prywatnej części klucza API).

Nagłówki HTTP

Klucz API i podpis są dostarczane do API za pośrednictwem niestandardowych nagłówków HTTP API-Key i API-Sign.

Klucz API służy do identyfikacji konta, do którego uzyskiwany jest dostęp, dlatego wartość klucza jest identyczna dla każdego wywołania API. Podpis kryptograficzny służy do uwierzytelniania wywołania API i jest obliczany przy użyciu zmiennych wartości (takich jak nonce), dlatego wartość podpisu jest różna dla każdego wywołania API.

Przykłady nagłówków HTTP API-Key i API-Sign są następujące:

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

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

Należy pamiętać, że wartość API-Key jest dokładnie taka sama jak pokazany powyżej klucz publiczny, ale wartość API-Sign (podpis) różni się od pokazanego powyżej klucza prywatnego i będzie zmieniać się na nową wartość dla każdego wywołania API.

Pseudokod podpisu

Nasza dokumentacja API stwierdza, że wartość API-Sign to "podpis wiadomości wykorzystujący HMAC-SHA512 (ścieżka URI + SHA256(nonce + dane POST)) i klucz API tajny dekodowany base64", który można podzielić na kilka odrębnych części w następujący sposób:

Zmienne

  • Ścieżka URI = URL wywołania API bez 'https://api.kraken.com'.

  • nonce = Unikalny identyfikator, którego wartość musi wzrastać z każdym wywołaniem API (często znacznik czasu UNIX, czyli bieżący czas w sekundach (lub milisekundach dla wyższej rozdzielczości) od 1 stycznia 1970 roku).

  • Dane POST = Pary nazwa/wartość zakodowane w formularzu dla nonce i parametrów metody API.

Przykłady zmiennych dla wywołania metody TradeBalance są następujące (należy pamiętać, że wszystkie wartości są wartościami tekstowymi, niezależnie od tego, co reprezentują):

  • Ścieżka URI = "/0/private/TradeBalance"

  • nonce = "1540973848000"

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

Algorytm

  • Oblicz SHA256 wartości nonce i danych POST.

  • Zdekoduj tajny klucz API (prywatną część klucza API) z base64.

  • Oblicz HMAC ścieżki URI i SHA256, używając SHA512 jako funkcji skrótu HMAC i zdekodowanego tajnego klucza API jako klucza HMAC.

  • Zakoduj HMAC w base64.

Poniżej przedstawiono przykład algorytmu wykorzystującego zmienne pokazane powyżej:

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

Wynikiem jest wartość API-Sign.

Przykładowy kod

Poniżej przedstawiono minimalne (bez sprawdzania błędów), ale w pełni funkcjonalne przykłady generowania podpisu uwierzytelniającego API dla punktu końcowego 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;

Potrzebujesz więcej pomocy?