Ποιος είναι ο αλγόριθμος ελέγχου ταυτότητας για ιδιωτικά τελικά σημεία;

Τελευταία ενημέρωση: 1 Απριλίου 2025

Ο έλεγχος ταυτότητας API απαιτείται κάθε φορά που μια κλήση API αποκτά πρόσβαση σε έναν λογαριασμό μέσω μίας από τις ιδιωτικές μεθόδους API.

Για παράδειγμα, οι μέθοδοι διαχείρισης λογαριασμού όπως Balance, TradeBalance και OpenOrders· οι μέθοδοι συναλλαγών AddOrder και CancelOrder· και οι μέθοδοι χρηματοδότησης όπως DepositAddresses και WithdrawInfo, είναι όλες ιδιωτικές μέθοδοι API που θα απαιτούσαν έλεγχο ταυτότητας API.

Κλειδιά API και Κρυπτογραφικές Υπογραφές

Ο έλεγχος ταυτότητας API βασίζεται σε ένα ζεύγος δημόσιου/ιδιωτικού κλειδιού (συλλογικά γνωστό ως κλειδί API) και μια κρυπτογραφική υπογραφή χρησιμοποιώντας αλγόριθμους κατακερματισμού όπως SHA256 και HMAC SHA512.

Ένα παράδειγμα κλειδιού API θα αποτελούνταν από ένα δημόσιο και ένα ιδιωτικό κλειδί παρόμοια με τα ακόλουθα:

bash

Bash

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

Σημειώστε ότι αυτά τα παραδείγματα δεν μπορούν να χρησιμοποιηθούν καθώς δεν συνδέονται με κανέναν λογαριασμό Kraken.

Οι κρυπτογραφικές υπογραφές δημιουργούνται σε πραγματικό χρόνο από τον κώδικα πελάτη API. Τα δεδομένα για την κλήση API περνούν μέσα από μια σειρά αλγορίθμων κατακερματισμού και ελέγχου ταυτότητας μηνυμάτων, οι οποίοι υπογράφουν με ασφάλεια τα δεδομένα χρησιμοποιώντας το μυστικό API (το ιδιωτικό μέρος του κλειδιού API).

Κεφαλίδες HTTP

Το κλειδί API και η υπογραφή παρέχονται στο API μέσω των προσαρμοσμένων κεφαλίδων HTTP API-Key και API-Sign.

Το κλειδί API χρησιμοποιείται για την αναγνώριση του λογαριασμού στον οποίο γίνεται πρόσβαση, επομένως η τιμή του κλειδιού είναι ίδια για κάθε κλήση API. Η κρυπτογραφική υπογραφή χρησιμοποιείται για τον έλεγχο ταυτότητας της κλήσης API και υπολογίζεται χρησιμοποιώντας μεταβλητές τιμές (όπως το nonce), επομένως η τιμή της υπογραφής είναι διαφορετική για κάθε κλήση API.

Παραδείγματα των κεφαλίδων HTTP API-Key και API-Sign είναι τα εξής:

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

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

Σημειώστε ότι η τιμή API-Key είναι ακριβώς η ίδια με το δημόσιο κλειδί που εμφανίζεται παραπάνω, αλλά η τιμή API-Sign (η υπογραφή) είναι διαφορετική από το ιδιωτικό κλειδί που εμφανίζεται παραπάνω και θα αλλάζει σε νέα τιμή για κάθε κλήση API.

Ψευδοκώδικας Υπογραφής

Η τεκμηρίωση API μας αναφέρει ότι η τιμή API-Sign είναι μια "υπογραφή μηνύματος χρησιμοποιώντας HMAC-SHA512 του (URI path + SHA256(nonce + POST data)) και αποκωδικοποιημένο μυστικό κλειδί API base64", η οποία μπορεί να διαχωριστεί σε διάφορα διακριτά μέρη ως εξής:

Μεταβλητές

  • URI path = URL κλήσης API χωρίς το 'https://api.kraken.com'.

  • nonce = Ένας μοναδικός αναγνωριστικός κωδικός που πρέπει να αυξάνεται σε τιμή με κάθε κλήση API (συχνά ένα UNIX timestamp, το οποίο είναι η τρέχουσα ώρα σε δευτερόλεπτα (ή χιλιοστά του δευτερολέπτου για υψηλότερη ανάλυση) από την 1η Ιανουαρίου 1970).

  • POST data = Ζεύγη ονόματος/τιμής κωδικοποιημένα σε φόρμα του nonce και των παραμέτρων μεθόδου API.

Παραδείγματα των μεταβλητών για μια κλήση στη μέθοδο TradeBalance είναι τα εξής (σημειώστε ότι όλες οι τιμές είναι τιμές συμβολοσειράς ανεξάρτητα από το τι αντιπροσωπεύουν οι τιμές):

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

  • nonce = "1540973848000"

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

Αλγόριθμος

  • Υπολογίστε το SHA256 του nonce και των δεδομένων POST.

  • Αποκωδικοποιήστε το μυστικό API (το ιδιωτικό μέρος του κλειδιού API) από base64.

  • Υπολογίστε το HMAC του URI path και του SHA256, χρησιμοποιώντας SHA512 ως κατακερματισμό HMAC και το αποκωδικοποιημένο μυστικό API ως κλειδί HMAC.

  • Κωδικοποιήστε το HMAC σε base64.

Ένα παράδειγμα του αλγορίθμου χρησιμοποιώντας τις μεταβλητές που εμφανίζονται παραπάνω είναι το εξής:

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

Το αποτέλεσμα είναι η τιμή API-Sign.

Παράδειγμα Κώδικα

Ελάχιστα (χωρίς έλεγχο σφαλμάτων) αλλά πλήρως λειτουργικά παραδείγματα δημιουργίας υπογραφής ελέγχου ταυτότητας API για το τελικό σημείο API TradeBalance είναι τα εξής:

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;

Χρειάζεστε περισσότερη βοήθεια;