Vad är autentiseringsalgoritmen för privata slutpunkter?

Senast uppdaterad: 1 april 2025

API-autentisering krävs när ett API-anrop får åtkomst till ett konto via en av de privata API-metoderna.

Till exempel är kontohanteringsmetoderna som Balance, TradeBalance och OpenOrders; handelsmetoderna AddOrder och CancelOrder; och finansieringsmetoderna som DepositAddresses och WithdrawInfo, alla privata API-metoder som skulle kräva API-autentisering.

API-nycklar och kryptografiska signaturer

API-autentisering baseras på ett offentligt/privat nyckelpar (gemensamt känt som en API-nyckel) och en kryptografisk signatur som använder hash-algoritmer som SHA256 och HMAC SHA512.

En exempel-API-nyckel skulle bestå av en offentlig och privat nyckel liknande följande:

bash

Bash

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

Observera att dessa exempel inte kan användas eftersom de inte är associerade med något Kraken-konto.

Kryptografiska signaturer skapas i realtid av API-klientkoden. Data för API-anropet passerar genom en serie hash- och meddelandeautentiseringsalgoritmer som säkert signerar data med hjälp av API-hemligheten (den privata delen av API-nyckeln).

HTTP-huvuden

API-nyckeln och signaturen tillhandahålls API:et via de anpassade HTTP-huvudena API-Key och API-Sign.

API-nyckeln används för att identifiera vilket konto som nås, därför är nyckelvärdet identiskt för varje API-anrop. Den kryptografiska signaturen används för att autentisera API-anropet och beräknas med variabla värden (som nonce), därför är signaturvärdet annorlunda för varje API-anrop.

Exempel på HTTP-huvudena API-Key och API-Sign är följande:

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

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

Observera att API-Key-värdet är exakt detsamma som den offentliga nyckeln som visas ovan, men att API-Sign-värdet (signaturen) skiljer sig från den privata nyckeln som visas ovan och kommer att ändras till ett nytt värde för varje API-anrop.

Signatur pseudokod

Vår API-dokumentation anger att API-Sign-värdet är en "meddelandesignatur som använder HMAC-SHA512 av (URI-sökväg + SHA256(nonce + POST-data)) och base64-avkodad hemlig API-nyckel", vilket kan delas upp i flera distinkta delar enligt följande:

Variabler

  • URI-sökväg = URL för API-anrop utan 'https://api.kraken.com'.

  • nonce = En unik identifierare som måste öka i värde för varje API-anrop (ofta en UNIX-tidsstämpel, vilket är den aktuella tiden i sekunder (eller millisekunder för högre upplösning) sedan 1 januari 1970).

  • POST-data = Formulärkodade namn/värde-par för nonce och API-metodparametrarna.

Exempel på variablerna för ett anrop till metoden TradeBalance är följande (observera att alla värden är strängvärden oavsett vad värdena representerar):

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

  • nonce = "1540973848000"

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

Algoritm

  • Beräkna SHA256 av nonce och POST-data.

  • Avkoda API-hemligheten (den privata delen av API-nyckeln) från base64.

  • Beräkna HMAC av URI-sökvägen och SHA256, med SHA512 som HMAC-hash och den avkodade API-hemligheten som HMAC-nyckel.

  • Koda HMAC till base64.

Ett exempel på algoritmen med variablerna som visas ovan är följande:

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

Resultatet är API-Sign-värdet.

Exempelkod

Minimala (ingen felkontroll) men fullt funktionella exempel på hur man genererar en API-autentiseringssignatur för TradeBalance API-slutpunkten är följande:

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;

Behöver du mer hjälp?