Qual è l'algoritmo di autenticazione per gli endpoint privati?

Ultimo aggiornamento: 1 apr 2025

L'autenticazione API è richiesta ogni volta che una chiamata API accede a un account tramite uno dei metodi API privati.

Ad esempio, i metodi di gestione dell'account come Balance, TradeBalance e OpenOrders; i metodi di trading AddOrder e CancelOrder; e i metodi di finanziamento come DepositAddresses e WithdrawInfo, sono tutti metodi API privati che richiederebbero l'autenticazione API.

Chiavi API e firme crittografiche

L'autenticazione API si basa su una coppia di chiavi pubblica/privata (conosciuta collettivamente come chiave API) e una firma crittografica che utilizza algoritmi hash come SHA256 e HMAC SHA512.

Un esempio di chiave API consisterebbe in una chiave pubblica e privata simile a quanto segue:

bash

Bash

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

Si noti che questi esempi non possono essere utilizzati in quanto non sono associati a nessun account Kraken.

Le firme crittografiche vengono create in tempo reale dal codice client API. I dati per la chiamata API vengono passati attraverso una serie di algoritmi hash e di autenticazione dei messaggi che firmano in modo sicuro i dati utilizzando il segreto API (la parte privata della chiave API).

Intestazioni HTTP

La chiave API e la firma vengono fornite all'API tramite le intestazioni HTTP personalizzate API-Key e API-Sign.

La chiave API viene utilizzata per identificare quale account viene acceduto, quindi il valore della chiave è identico per ogni chiamata API. La firma crittografica viene utilizzata per autenticare la chiamata API e viene calcolata utilizzando valori variabili (come il nonce), quindi il valore della firma è diverso per ogni chiamata API.

Esempi delle intestazioni HTTP API-Key e API-Sign sono i seguenti:

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

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

Si noti che il valore API-Key è esattamente lo stesso della chiave pubblica mostrata sopra, ma che il valore API-Sign (la firma) è diverso dalla chiave privata mostrata sopra e cambierà con un nuovo valore per ogni chiamata API.

Pseudocodice della firma

La nostra documentazione API afferma che il valore API-Sign è una "firma del messaggio che utilizza HMAC-SHA512 di (percorso URI + SHA256(nonce + dati POST)) e chiave API segreta decodificata in base64", che può essere separata in diverse parti distinte come segue:

Variabili

  • Percorso URI = URL della chiamata API senza 'https://api.kraken.com'.

  • nonce = Un identificatore univoco il cui valore deve aumentare ad ogni chiamata API (spesso un timestamp UNIX, che è l'ora corrente in secondi (o millisecondi per una risoluzione maggiore) dal 1° gennaio 1970).

  • Dati POST = Coppie nome/valore codificate in formato del nonce e dei parametri del metodo API.

Esempi delle variabili per una chiamata al metodo TradeBalance sono i seguenti (si noti che tutti i valori sono valori stringa indipendentemente da ciò che rappresentano):

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

  • nonce = "1540973848000"

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

Algoritmo

  • Calcola l'SHA256 del nonce e dei dati POST.

  • Decodifica il segreto API (la parte privata della chiave API) da base64.

  • Calcola l'HMAC del percorso URI e dell'SHA256, utilizzando SHA512 come hash HMAC e il segreto API decodificato come chiave HMAC.

  • Codifica l'HMAC in base64.

Un esempio dell'algoritmo che utilizza le variabili mostrate sopra è il seguente:

  • Base64Encode(HMAC-SHA512 di ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")) usando Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") come chiave HMAC

Il risultato è il valore API-Sign.

Codice di esempio

Di seguito sono riportati esempi minimi (senza controllo errori) ma completamente funzionali di generazione di una firma di autenticazione API per l'endpoint 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;

Hai ancora bisogno di aiuto?