Hva er autentiseringsalgoritmen for private endepunkter?

Sist oppdatert: 1. april 2025

API-autentisering kreves når et API-kall får tilgang til en konto via en av de private API-metodene.

For eksempel er kontoadministrasjonsmetodene som Balance, TradeBalance og OpenOrders; handelsmetodene AddOrder og CancelOrder; og finansieringsmetodene som DepositAddresses og WithdrawInfo, alle private API-metoder som krever API-autentisering.

API-nøkler og kryptografiske signaturer

API-autentisering er basert på et offentlig/privat nøkkelpar (samlet kjent som en API-nøkkel) og en kryptografisk signatur som bruker hash-algoritmer som SHA256 og HMAC SHA512.

Et eksempel på en API-nøkkel vil bestå av en offentlig og privat nøkkel som ligner på følgende:

bash

Bash

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

Merk at disse eksemplene ikke kan brukes da de ikke er knyttet til noen Kraken-konto.

Kryptografiske signaturer opprettes i sanntid av API-klientkoden. Dataene for API-kallet sendes gjennom en serie hash- og meldingsautentiseringsalgoritmer som sikkert signerer dataene ved hjelp av API-hemmeligheten (den private delen av API-nøkkelen).

HTTP-hoder

API-nøkkelen og signaturen leveres til API-et via de tilpassede HTTP-hodene API-Key og API-Sign.

API-nøkkelen brukes til å identifisere hvilken konto som blir tilgang til, derfor er nøkkelverdien identisk for hvert API-kall. Den kryptografiske signaturen brukes til å autentisere API-kallet og beregnes ved hjelp av variable verdier (som nonce), derfor er signaturverdien forskjellig for hvert API-kall.

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

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

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

Merk at API-Key-verdien er nøyaktig den samme som den offentlige nøkkelen vist ovenfor, men at API-Sign-verdien (signaturen) er forskjellig fra den private nøkkelen vist ovenfor og vil endres til en ny verdi for hvert API-kall.

Signatur pseudokode

Vår API-dokumentasjon angir at API-Sign-verdien er en "meldingssignatur som bruker HMAC-SHA512 av (URI-sti + SHA256(nonce + POST-data)) og base64-dekodet hemmelig API-nøkkel", som kan deles inn i flere distinkte deler som følger:

Variabler

  • URI-sti = URL for API-kall uten 'https://api.kraken.com'.

  • nonce = En unik identifikator som må øke i verdi for hvert API-kall (ofte et UNIX-tidsstempel, som er gjeldende tid i sekunder (eller millisekunder for høyere oppløsning) siden 1. januar 1970).

  • POST-data = Skjema-kodede navn/verdi-par av nonce og API-metodeparametrene.

Eksempler på variablene for et kall til TradeBalance-metoden er som følger (merk at alle verdiene er strengverdier uavhengig av hva verdiene representerer):

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

  • nonce = "1540973848000"

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

Algoritme

  • Beregn SHA256 av nonce og POST-dataene.

  • Dekod API-hemmeligheten (den private delen av API-nøkkelen) fra base64.

  • Beregn HMAC av URI-stien og SHA256, ved å bruke SHA512 som HMAC-hash og den dekodede API-hemmeligheten som HMAC-nøkkel.

  • Kod HMAC til base64.

Et eksempel på algoritmen som bruker variablene 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-verdien.

Eksempelkode

Minimale (ingen feilkontroll) men fullt funksjonelle eksempler på generering av en API-autentiseringssignatur for TradeBalance API-endepunktet 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;

Trenger du mer hjelp?