Mikä on todennusalgoritmi yksityisille päätepisteille?

Viimeksi päivitetty: 1.4.2025

API-todennus vaaditaan aina, kun API-kutsu käyttää tiliä jollakin yksityisistä API-menetelmistä.

Esimerkiksi tilinhallintamenetelmät, kuten Balance, TradeBalance ja OpenOrders; kaupankäyntimenetelmät AddOrder ja CancelOrder; ja rahoitusmenetelmät, kuten DepositAddresses ja WithdrawInfo, ovat kaikki yksityisiä API-menetelmiä, jotka vaativat API-todennuksen.

API-avaimet ja kryptografiset allekirjoitukset

API-todennus perustuu julkisen/yksityisen avaimen pariin (yhdessä tunnetaan nimellä API-avain) ja kryptografiseen allekirjoitukseen käyttäen hash-algoritmeja, kuten SHA256 ja HMAC SHA512.

Esimerkki API-avaimesta koostuisi julkisesta ja yksityisestä avaimesta seuraavanlaisesti:

bash

Bash

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

Huomaa, että näitä esimerkkejä ei voi käyttää, koska ne eivät liity mihinkään Kraken-tiliin.

Kryptografiset allekirjoitukset luodaan reaaliaikaisesti API-asiakaskoodilla. API-kutsun tiedot kulkevat useiden hash- ja viestitodennusalgoritmien läpi, jotka allekirjoittavat tiedot turvallisesti käyttäen API-salaisuutta (API-avaimen yksityinen osa).

HTTP-otsikot

API-avain ja allekirjoitus toimitetaan API:lle mukautettujen HTTP-otsikoiden API-Key ja API-Sign kautta.

API-avainta käytetään tunnistamaan, mihin tiliin päästään, joten avaimen arvo on identtinen jokaisessa API-kutsussa. Kryptografista allekirjoitusta käytetään API-kutsun todentamiseen, ja se lasketaan käyttämällä muuttuvia arvoja (kuten nonce), joten allekirjoituksen arvo on erilainen jokaisessa API-kutsussa.

Esimerkkejä API-Key- ja API-Sign-HTTP-otsikoista ovat seuraavat:

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

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

Huomaa, että API-Key-arvo on täsmälleen sama kuin yllä esitetty julkinen avain, mutta API-Sign-arvo (allekirjoitus) eroaa yllä esitetystä yksityisestä avaimesta ja muuttuu uudeksi arvoksi jokaisessa API-kutsussa.

Allekirjoituksen pseudokoodi

Meidän API-dokumentaatiomme ilmoittaa, että API-Sign-arvo on "viestin allekirjoitus käyttäen HMAC-SHA512:ta (URI-polku + SHA256(nonce + POST-data)) ja base64-dekoodattua salaista API-avainta", joka voidaan jakaa useisiin erillisiin osiin seuraavasti:

Muuttujat

  • URI-polku = API-kutsun URL ilman 'https://api.kraken.com'.

  • nonce = Yksilöllinen tunniste, jonka arvon on kasvettava jokaisen API-kutsun yhteydessä (usein UNIX-aikaleima, joka on nykyinen aika sekunteina (tai millisekunteina tarkempaa resoluutiota varten) tammikuun 1. päivästä 1970 lähtien).

  • POST-data = Lomakkeella koodatut nimi/arvo-parit noncesta ja API-menetelmän parametreista.

Esimerkkejä TradeBalance-menetelmän kutsun muuttujista ovat seuraavat (huomaa, että kaikki arvot ovat merkkijonoarvoja riippumatta siitä, mitä arvot edustavat):

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

  • nonce = "1540973848000"

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

Algoritmi

  • Laske nonce-arvon ja POST-datan SHA256.

  • Dekoodaa API-salaisuus (API-avaimen yksityinen osa) base64:stä.

  • Laske URI-polun ja SHA256:n HMAC käyttäen SHA512:ta HMAC-hajautuksena ja dekoodattua API-salaisuutta HMAC-avaimena.

  • Koodaa HMAC base64:ksi.

Esimerkki algoritmista käyttäen yllä esitettyjä muuttujia on seuraava:

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

Tulos on API-Sign-arvo.

Esimerkkikoodi

Minimaaliset (ei virheentarkistusta), mutta täysin toimivat esimerkit API-todennussignatuurin luomisesta TradeBalance API-päätepisteelle ovat seuraavat:

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;

Tarvitsetko lisää apua?