Was ist der Authentifizierungsalgorithmus für private Endpunkte?

Zuletzt aktualisiert: 1. Apr. 2025

Die API-Authentifizierung ist immer dann erforderlich, wenn ein API-Aufruf über eine der privaten API-Methoden auf ein Konto zugreift.

Zum Beispiel sind die Kontoverwaltungsmethoden wie Balance, TradeBalance und OpenOrders; die Handelsmethoden AddOrder und CancelOrder; und die Finanzierungsmethoden wie DepositAddresses und WithdrawInfo allesamt private API-Methoden, die eine API-Authentifizierung erfordern würden.

API-Schlüssel und kryptografische Signaturen

Die API-Authentifizierung basiert auf einem öffentlichen/privaten Schlüsselpaar (zusammenfassend als API-Schlüssel) und einer kryptografischen Signatur unter Verwendung von Hash-Algorithmen wie SHA256 und HMAC SHA512.

Ein Beispiel für einen API-Schlüssel würde aus einem öffentlichen und einem privaten Schlüssel bestehen, ähnlich den folgenden:

bash

Bash

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

Beachten Sie, dass diese Beispiele nicht verwendet werden können, da sie keinem Kraken-Konto zugeordnet sind.

Kryptografische Signaturen werden in Echtzeit vom API-Client-Code erstellt. Die Daten für den API-Aufruf werden durch eine Reihe von Hash- und Nachrichtenauthentifizierungsalgorithmen geleitet, die die Daten mithilfe des API-Geheimnisses (des privaten Teils des API-Schlüssels) sicher signieren.

HTTP-Header

Der API-Schlüssel und die Signatur werden der API über die benutzerdefinierten HTTP-Header API-Key und API-Sign bereitgestellt.

Der API-Schlüssel wird verwendet, um zu identifizieren, auf welches Konto zugegriffen wird, daher ist der Schlüsselwert für jeden API-Aufruf identisch. Die kryptografische Signatur wird zur Authentifizierung des API-Aufrufs verwendet und wird unter Verwendung variabler Werte (wie der Nonce) berechnet, daher ist der Signaturwert für jeden API-Aufruf unterschiedlich.

Beispiele für die HTTP-Header API-Key und API-Sign sind wie folgt:

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

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

Beachten Sie, dass der API-Key-Wert genau derselbe ist wie der oben gezeigte öffentliche Schlüssel, aber der API-Sign-Wert (die Signatur) sich vom oben gezeigten privaten Schlüssel unterscheidet und sich für jeden API-Aufruf in einen neuen Wert ändert.

Signatur-Pseudocode

Unsere API-Dokumentation besagt, dass der API-Sign-Wert eine „Nachrichtensignatur unter Verwendung von HMAC-SHA512 von (URI-Pfad + SHA256(Nonce + POST-Daten)) und einem base64-dekodierten geheimen API-Schlüssel“ ist, die wie folgt in mehrere verschiedene Teile unterteilt werden kann:

Variablen

  • URI-Pfad = URL des API-Aufrufs ohne 'https://api.kraken.com'.

  • Nonce = Ein eindeutiger Bezeichner, dessen Wert mit jedem API-Aufruf steigen muss (oft ein UNIX-Zeitstempel, der die aktuelle Zeit in Sekunden (oder Millisekunden für höhere Auflösung) seit dem 1. Januar 1970 ist).

  • POST-Daten = Formular-kodierte Name/Wert-Paare der Nonce und der API-Methodenparameter.

Beispiele für die Variablen für einen Aufruf der TradeBalance-Methode sind wie folgt (beachten Sie, dass alle Werte Zeichenkettenwerte sind, unabhängig davon, was die Werte darstellen):

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

  • nonce = "1540973848000"

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

Algorithmus

  • Berechnen Sie den SHA256 des Nonce und der POST-Daten.

  • Dekodieren Sie das API-Geheimnis (den privaten Teil des API-Schlüssels) aus Base64.

  • Berechnen Sie den HMAC des URI-Pfads und des SHA256, wobei SHA512 als HMAC-Hash und das dekodierte API-Geheimnis als HMAC-Schlüssel verwendet wird.

  • Kodieren Sie den HMAC in Base64.

Ein Beispiel des Algorithmus unter Verwendung der oben gezeigten Variablen ist wie folgt:

  • Base64Encode(HMAC-SHA512 von ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")) unter Verwendung von Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") als HMAC-Schlüssel

Das Ergebnis ist der API-Sign-Wert.

Beispielcode

Minimale (ohne Fehlerprüfung), aber voll funktionsfähige Beispiele zur Generierung einer API-Authentifizierungssignatur für den TradeBalance API-Endpunkt sind wie folgt:

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;

Brauchst du weitere Hilfe?