Hvad er autentificeringsalgoritmen for private slutpunkter?

Sidst opdateret: 1. april 2025

API-autentificering er påkrævet, når et API-kald tilgår en konto via en af de private API-metoder.

For eksempel er kontostyringsmetoder som Balance, TradeBalance og OpenOrders; handelsmetoderne AddOrder og CancelOrder; og finansieringsmetoderne som DepositAddresses og WithdrawInfo alle private API-metoder, der kræver API-autentificering.

API-nøgler og kryptografiske signaturer

API-autentificering er baseret på et offentligt/privat nøglepar (samlet kendt som en API-nøgle) og en kryptografisk signatur, der bruger hash-algoritmer som SHA256 og HMAC SHA512.

Et eksempel på en API-nøgle ville bestå af en offentlig og privat nøgle, der ligner følgende:

bash

Bash

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

Bemærk, at disse eksempler ikke kan bruges, da de ikke er tilknyttet nogen Kraken-konto.

Kryptografiske signaturer oprettes i realtid af API-klientkoden. Dataene for API-kaldet sendes gennem en række hash- og meddelelsesautentificeringsalgoritmer, som sikkert signerer dataene ved hjælp af API-hemmeligheden (den private del af API-nøglen).

HTTP-headere

API-nøglen og signaturen leveres til API'en via de brugerdefinerede HTTP-headere API-Key og API-Sign.

API-nøglen bruges til at identificere, hvilken konto der tilgås, og derfor er nøgleværdien identisk for hvert API-kald. Den kryptografiske signatur bruges til at autentificere API-kaldet og beregnes ved hjælp af variable værdier (såsom nonce), og derfor er signaturværdien forskellig for hvert API-kald.

Eksempler på API-Key og API-Sign HTTP-headere er som følger:

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

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

Bemærk, at API-Key-værdien er nøjagtig den samme som den offentlige nøgle vist ovenfor, men at API-Sign-værdien (signaturen) er forskellig fra den private nøgle vist ovenfor og vil ændre sig til en ny værdi for hvert API-kald.

Signatur-pseudokode

Vores API-dokumentation angiver, at API-Sign-værdien er en "meddelelsessignatur, der bruger HMAC-SHA512 af (URI-sti + SHA256(nonce + POST-data)) og base64-dekodet hemmelig API-nøgle", som kan opdeles i flere forskellige dele som følger:

Variabler

  • URI path = URL for API-kald uden 'https://api.kraken.com'.

  • nonce = En unik identifikator, hvis værdi skal stige med hvert API-kald (ofte et UNIX-tidsstempel, som er den aktuelle tid i sekunder (eller millisekunder for højere opløsning) siden 1. januar 1970).

  • POST data = Form-kodede navn/værdi-par af nonce og API-metodeparametrene.

Eksempler på variablerne for et kald til TradeBalance-metoden er som følger (bemærk, at alle værdierne er strengværdier, uanset hvad værdierne repræsenterer):

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

  • nonce = "1540973848000"

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

Algoritme

  • Beregn SHA256 af nonce og POST-dataene.

  • Dekod API-hemmeligheden (den private del af API-nøglen) fra base64.

  • Beregn HMAC af URI-stien og SHA256, ved at bruge SHA512 som HMAC-hash og den dekodede API-hemmelighed som HMAC-nøgle.

  • Kod HMAC til base64.

Et eksempel på algoritmen, der bruger variablerne vist ovenfor, er som følger:

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

Resultatet er API-Sign-værdien.

Eksempelkode

Minimale (ingen fejlkontrol), men fuldt funktionelle eksempler på generering af en API-autentificeringssignatur for TradeBalance API-slutpunktet er som følger:

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;

Har du brug for mere hjælp?