Wat is het authenticatie-algoritme voor privé-eindpunten?

Laatst bijgewerkt: 1 apr 2025

API-authenticatie is vereist wanneer een API-aanroep een account benadert via een van de privé API-methoden.

Bijvoorbeeld, de accountbeheermethoden zoals Balance, TradeBalance en OpenOrders; de handelsmethoden AddOrder en CancelOrder; en de financieringsmethoden zoals DepositAddresses en WithdrawInfo, zijn allemaal privé API-methoden die API-authenticatie vereisen.

API-sleutels en cryptografische handtekeningen

API-authenticatie is gebaseerd op een openbaar/privé sleutelpaar (gezamenlijk bekend als een API-sleutel) en een cryptografische handtekening met behulp van hash-algoritmen zoals SHA256 en HMAC SHA512.

Een voorbeeld van een API-sleutel zou bestaan uit een openbare en privé sleutel, vergelijkbaar met de volgende:

bash

Bash

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

Merk op dat deze voorbeelden niet kunnen worden gebruikt, aangezien ze niet zijn gekoppeld aan een Kraken-account.

Cryptografische handtekeningen worden in realtime gemaakt door de API-clientcode. De gegevens voor de API-aanroep worden door een reeks hash- en berichtauthenticatie-algoritmen geleid die de gegevens veilig ondertekenen met behulp van het API-geheim (het privégedeelte van de API-sleutel).

HTTP-headers

De API-sleutel en handtekening worden aan de API geleverd via de aangepaste HTTP-headers API-Key en API-Sign.

De API-sleutel wordt gebruikt om te identificeren welk account wordt benaderd, vandaar dat de sleutelwaarde identiek is voor elke API-aanroep. De cryptografische handtekening wordt gebruikt om de API-aanroep te authenticeren en wordt berekend met behulp van variabele waarden (zoals de nonce), vandaar dat de handtekeningwaarde voor elke API-aanroep anders is.

Voorbeelden van de API-Key en API-Sign HTTP-headers zijn als volgt:

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

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

Merk op dat de API-Key waarde exact hetzelfde is als de hierboven getoonde openbare sleutel, maar dat de API-Sign waarde (de handtekening) verschilt van de hierboven getoonde privé sleutel en zal veranderen naar een nieuwe waarde voor elke API-aanroep.

Pseudocode voor handtekening

Onze API-documentatie stelt dat de API-Sign waarde een "message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key" is, die in verschillende afzonderlijke delen kan worden opgesplitst, als volgt:

Variabelen

  • URI-pad = URL van API-aanroep zonder 'https://api.kraken.com'.

  • nonce = Een unieke identificatie die in waarde moet toenemen bij elke API-aanroep (vaak een UNIX-tijdstempel, wat de huidige tijd in seconden (of milliseconden voor hogere resolutie) is sinds 1 januari 1970).

  • POST-gegevens = Formulier-gecodeerde naam/waarde-paren van de nonce en de API-methode parameters.

Voorbeelden van de variabelen voor een aanroep naar de TradeBalance methode zijn als volgt (merk op dat alle waarden tekenreekswaarden zijn, ongeacht wat de waarden vertegenwoordigen):

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

  • nonce = "1540973848000"

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

Algoritme

  • Bereken de SHA256 van de nonce en de POST-gegevens.

  • Decodeer het API-geheim (het privégedeelte van de API-sleutel) van base64.

  • Bereken de HMAC van het URI-pad en de SHA256, met SHA512 als de HMAC-hash en het gedecodeerde API-geheim als de HMAC-sleutel.

  • Codeer de HMAC naar base64.

Een voorbeeld van het algoritme met de hierboven getoonde variabelen is als volgt:

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

Het resultaat is de API-Sign waarde.

Voorbeeldcode

Minimale (geen foutcontrole) maar volledig functionele voorbeelden van het genereren van een API-authenticatiesignatuur voor het TradeBalance API-eindpunt zijn als volgt:

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;

Meer hulp nodig?