Jaký je autentizační algoritmus pro privátní koncové body?

Naposledy aktualizováno: 1. dubna 2025

Autentizace API je vyžadována vždy, když volání API přistupuje k účtu prostřednictvím jedné z privátních metod API.

Například metody správy účtu jako Balance, TradeBalance a OpenOrders; obchodní metody AddOrder a CancelOrder; a metody financování jako DepositAddresses a WithdrawInfo, jsou všechny privátní metody API, které by vyžadovaly autentizaci API.

API klíče a kryptografické podpisy

Autentizace API je založena na páru veřejného/privátního klíče (souhrnně známém jako API klíč) a kryptografickém podpisu využívajícím hashovací algoritmy jako SHA256 a HMAC SHA512.

Příklad API klíče by se skládal z veřejného a privátního klíče podobného následujícímu:

bash

Bash

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

Všimněte si, že tyto příklady nelze použít, protože nejsou spojeny s žádným účtem Kraken.

Kryptografické podpisy jsou vytvářeny v reálném čase kódem klienta API. Data pro volání API procházejí řadou hashovacích a autentizačních algoritmů zpráv, které bezpečně podepisují data pomocí API tajného klíče (privátní části API klíče).

HTTP hlavičky

API klíč a podpis jsou poskytovány API prostřednictvím vlastních HTTP hlaviček API-Key a API-Sign.

API klíč se používá k identifikaci, ke kterému účtu se přistupuje, proto je hodnota klíče identická pro každé volání API. Kryptografický podpis se používá k autentizaci volání API a je vypočítán pomocí proměnných hodnot (jako je nonce), proto se hodnota podpisu liší pro každé volání API.

Příklady HTTP hlaviček API-Key a API-Sign jsou následující:

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

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

Všimněte si, že hodnota API-Key je přesně stejná jako výše uvedený veřejný klíč, ale hodnota API-Sign (podpis) se liší od výše uvedeného privátního klíče a pro každé volání API se změní na novou hodnotu.

Pseudokód podpisu

Naše dokumentace API uvádí, že hodnota API-Sign je „podpis zprávy používající HMAC-SHA512 z (cesty URI + SHA256(nonce + POST data)) a base64 dekódovaného tajného klíče API“, což lze rozdělit na několik odlišných částí následovně:

Proměnné

  • URI path = URL volání API bez 'https://api.kraken.com'.

  • nonce = Jedinečný identifikátor, jehož hodnota se musí s každým voláním API zvyšovat (často UNIX časová značka, což je aktuální čas v sekundách (nebo milisekundách pro vyšší rozlišení) od 1. ledna 1970).

  • POST data = Páry název/hodnota kódované formulářem z nonce a parametrů metody API.

Příklady proměnných pro volání metody TradeBalance jsou následující (všimněte si, že všechny hodnoty jsou řetězcové hodnoty bez ohledu na to, co hodnoty představují):

  • URI path = "/0/private/TradeBalance"

  • nonce = "1540973848000"

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

Algoritmus

  • Vypočítejte SHA256 z nonce a POST dat.

  • Dekódujte API tajný klíč (privátní část API klíče) z base64.

  • Vypočítejte HMAC z cesty URI a SHA256, použijte SHA512 jako HMAC hash a dekódovaný API tajný klíč jako HMAC klíč.

  • Zakódujte HMAC do base64.

Příklad algoritmu s použitím výše uvedených proměnných je následující:

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

Výsledkem je hodnota API-Sign.

Příklad kódu

Minimální (bez kontroly chyb), ale plně funkční příklady generování autentizačního podpisu API pro koncový bod API TradeBalance jsou následující:

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;

Potřebujete další pomoc?