Care este algoritmul de autentificare pentru endpoint-urile private?

Ultima actualizare: 1 aprilie 2025

Autentificarea API este necesară ori de câte ori un apel API accesează un cont printr-una dintre metodele API private.

De exemplu, metodele de gestionare a contului, cum ar fi Balance, TradeBalance și OpenOrders; metodele de tranzacționare AddOrder și CancelOrder; și metodele de finanțare, cum ar fi DepositAddresses și WithdrawInfo, sunt toate metode API private care ar necesita autentificare API.

Chei API și Semnături Criptografice

Autentificarea API se bazează pe o pereche de chei publice/private (cunoscute colectiv sub denumirea de cheie API) și o semnătură criptografică folosind algoritmi hash precum SHA256 și HMAC SHA512.

O cheie API exemplu ar consta dintr-o cheie publică și una privată, similar cu următoarele:

bash

Bash

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

Rețineți că aceste exemple nu pot fi utilizate, deoarece nu sunt asociate cu niciun cont Kraken.

Semnăturile criptografice sunt create în timp real de codul clientului API. Datele pentru apelul API sunt transmise printr-o serie de algoritmi hash și de autentificare a mesajelor care semnează în siguranță datele folosind secretul API (partea privată a cheii API).

Anteturi HTTP

Cheia API și semnătura sunt furnizate API-ului prin anteturile HTTP personalizate API-Key și API-Sign.

Cheia API este utilizată pentru a identifica ce cont este accesat, prin urmare valoarea cheii este identică pentru fiecare apel API. Semnătura criptografică este utilizată pentru a autentifica apelul API și este calculată folosind valori variabile (cum ar fi nonce), prin urmare valoarea semnăturii este diferită pentru fiecare apel API.

Exemple de anteturi HTTP API-Key și API-Sign sunt următoarele:

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

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

Rețineți că valoarea API-Key este exact aceeași cu cheia publică prezentată mai sus, dar că valoarea API-Sign (semnătura) este diferită de cheia privată prezentată mai sus și se va schimba la o nouă valoare pentru fiecare apel API.

Pseudocod Semnătură

Documentația noastră API precizează că valoarea API-Sign este o „semnătură de mesaj folosind HMAC-SHA512 a (URI path + SHA256(nonce + POST data)) și cheia API secretă decodificată base64”, care poate fi separată în mai multe părți distincte, după cum urmează:

Variabile

  • URI path = URL-ul apelului API fără 'https://api.kraken.com'.

  • nonce = Un identificator unic a cărui valoare trebuie să crească la fiecare apel API (adesea un timestamp UNIX, care este ora curentă în secunde (sau milisecunde pentru o rezoluție mai mare) de la 1 ianuarie 1970).

  • POST data = Perechi nume/valoare codificate în formular ale nonce și ale parametrilor metodei API.

Exemple de variabile pentru un apel la metoda TradeBalance sunt următoarele (rețineți că toate valorile sunt valori șir, indiferent de ceea ce reprezintă valorile):

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

  • nonce = "1540973848000"

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

Algoritm

  • Calculați SHA256 al nonce și al POST data.

  • Decodificați secretul API (partea privată a cheii API) din base64.

  • Calculați HMAC al URI path și al SHA256, folosind SHA512 ca hash HMAC și secretul API decodificat ca cheie HMAC.

  • Codificați HMAC în base64.

Un exemplu al algoritmului folosind variabilele prezentate mai sus este următorul:

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

Rezultatul este valoarea API-Sign.

Cod Exemplu

Exemple minimale (fără verificare de erori), dar complet funcționale de generare a unei semnături de autentificare API pentru endpoint-ul API TradeBalance sunt următoarele:

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;

Ai nevoie de mai mult ajutor?