Mi a hitelesítési algoritmus a privát végpontokhoz?

Utolsó frissítés: 2025. április 1.

API hitelesítésre van szükség, amikor egy API hívás privát API metódusok segítségével hozzáfér egy fiókhoz.

Például a fiókkezelési metódusok, mint a Balance, TradeBalance és OpenOrders; a kereskedési metódusok, mint az AddOrder és CancelOrder; és a finanszírozási metódusok, mint a DepositAddresses és WithdrawInfo, mind privát API metódusok, amelyek API hitelesítést igényelnek.

API kulcsok és kriptográfiai aláírások

Az API hitelesítés egy nyilvános/privát kulcspáron (együttesen API kulcsként ismert) és egy kriptográfiai aláíráson alapul, amely hash algoritmusokat, például SHA256-ot és HMAC SHA512-t használ.

Egy példa API kulcs a következőhöz hasonló nyilvános és privát kulcsból állna:

bash

Bash

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

Vegye figyelembe, hogy ezek a példák nem használhatók, mivel nincsenek társítva semmilyen Kraken fiókhoz.

A kriptográfiai aláírásokat valós időben hozza létre az API kliens kódja. Az API hívás adatai egy sor hash és üzenet hitelesítési algoritmuson keresztül kerülnek feldolgozásra, amelyek biztonságosan aláírják az adatokat az API titokkal (az API kulcs privát része) felhasználásával.

HTTP fejlécek

Az API kulcs és az aláírás az API-nak a API-Key és API-Sign egyéni HTTP fejléceken keresztül kerül átadásra.

Az API kulcs arra szolgál, hogy azonosítsa, melyik fiókhoz történik hozzáférés, ezért a kulcs értéke minden API hívásnál azonos. A kriptográfiai aláírás az API hívás hitelesítésére szolgál, és változó értékek (például a nonce) felhasználásával kerül kiszámításra, ezért az aláírás értéke minden API hívásnál eltérő.

Az API-Key és API-Sign HTTP fejlécek példái a következők:

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

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

Vegye figyelembe, hogy az API-Key érték pontosan megegyezik a fent bemutatott nyilvános kulccsal, de az API-Sign érték (az aláírás) eltér a fent bemutatott privát kulcstól, és minden API hívásnál új értékre változik.

Aláírás pszeudokód

Az API dokumentációnk szerint az API-Sign érték egy „üzenet aláírás HMAC-SHA512 használatával (URI útvonal + SHA256(nonce + POST adat)) és base64 dekódolt titkos API kulcs”, amely több különálló részre bontható az alábbiak szerint:

Változók

  • URI útvonal = API hívás URL-je 'https://api.kraken.com' nélkül.

  • nonce = Egy egyedi azonosító, amelynek értéke minden API hívásnál növekednie kell (gyakran egy UNIX időbélyeg, amely az aktuális idő másodpercekben (vagy milliszekundumban a nagyobb felbontás érdekében) 1970. január 1. óta).

  • POST adat = A nonce és az API metódus paramétereinek űrlap-kódolt név/érték párosai.

A TradeBalance metódus hívásához tartozó változók példái a következők (vegye figyelembe, hogy az összes érték karakterlánc, függetlenül attól, hogy mit képviselnek az értékek):

  • URI útvonal = "/0/private/TradeBalance"

  • nonce = "1540973848000"

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

Algoritmus

  • Számítsa ki a nonce és a POST adat SHA256 értékét.

  • Dekódolja az API titkot (az API kulcs privát részét) base64-ből.

  • Számítsa ki az URI útvonal és az SHA256 HMAC értékét, SHA512-t használva HMAC hash-ként és a dekódolt API titkot HMAC kulcsként.

  • Kódolja az HMAC-et base64-be.

Az algoritmus fenti változókkal történő példája a következő:

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

Az eredmény az API-Sign érték.

Példakód

Minimális (hibakezelés nélküli), de teljesen működőképes példák az API hitelesítési aláírás generálására a TradeBalance API végponthoz a következők:

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;

További segítségre van szükséged?