Apakah algoritma pengesahan untuk titik akhir peribadi?

Terakhir dikemas kini: 1 April 2025

Pengesahan API diperlukan setiap kali panggilan API mengakses akaun melalui salah satu kaedah API peribadi.

Sebagai contoh, kaedah pengurusan akaun seperti Balance, TradeBalance dan OpenOrders; kaedah dagangan AddOrder dan CancelOrder; dan kaedah pembiayaan seperti DepositAddresses dan WithdrawInfo, semuanya adalah kaedah API peribadi yang memerlukan pengesahan API.

Kunci API dan Tandatangan Kriptografi

Pengesahan API adalah berdasarkan pasangan kunci awam/peribadi (secara kolektif dikenali sebagai kunci API) dan tandatangan kriptografi menggunakan algoritma hash seperti SHA256 dan HMAC SHA512.

Contoh kunci API akan terdiri daripada kunci awam dan peribadi yang serupa dengan berikut:

bash

Bash

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

Ambil perhatian bahawa contoh-contoh ini tidak boleh digunakan kerana ia tidak dikaitkan dengan mana-mana akaun Kraken.

Tandatangan kriptografi dicipta dalam masa nyata oleh kod klien API. Data untuk panggilan API dihantar melalui siri algoritma hash dan pengesahan mesej yang menandatangani data dengan selamat menggunakan rahsia API (bahagian peribadi kunci API).

Pengepala HTTP

Kunci API dan tandatangan disediakan kepada API melalui pengepala HTTP tersuai API-Key dan API-Sign.

Kunci API digunakan untuk mengenal pasti akaun mana yang diakses, oleh itu nilai kunci adalah sama untuk setiap panggilan API. Tandatangan kriptografi digunakan untuk mengesahkan panggilan API dan dikira menggunakan nilai berubah (seperti nonce), oleh itu nilai tandatangan adalah berbeza untuk setiap panggilan API.

Contoh pengepala HTTP API-Key dan API-Sign adalah seperti berikut:

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

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

Ambil perhatian bahawa nilai API-Key adalah sama persis dengan kunci awam yang ditunjukkan di atas, tetapi nilai API-Sign (tandatangan) adalah berbeza daripada kunci peribadi yang ditunjukkan di atas dan akan berubah kepada nilai baharu untuk setiap panggilan API.

Kod Pseudo Tandatangan

Dokumentasi API kami menyatakan bahawa nilai API-Sign adalah "tandatangan mesej menggunakan HMAC-SHA512 bagi (laluan URI + SHA256(nonce + data POST)) dan kunci API rahsia yang dinyahkod base64", yang boleh diasingkan kepada beberapa bahagian berbeza seperti berikut:

Pemboleh Ubah

  • Laluan URI = URL panggilan API tanpa 'https://api.kraken.com'.

  • nonce = Pengecam unik yang mesti meningkat nilainya dengan setiap panggilan API (selalunya cap waktu UNIX, iaitu masa semasa dalam saat (atau milisaat untuk resolusi lebih tinggi) sejak 1 Januari 1970).

  • Data POST = Pasangan nama/nilai yang dikodkan borang bagi nonce dan parameter kaedah API.

Contoh pemboleh ubah untuk panggilan kepada kaedah TradeBalance adalah seperti berikut (ambil perhatian bahawa semua nilai adalah nilai rentetan tanpa mengira apa yang diwakili oleh nilai tersebut):

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

  • nonce = "1540973848000"

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

Algoritma

  • Kira SHA256 bagi nonce dan data POST.

  • Nyahkod rahsia API (bahagian peribadi kunci API) daripada base64.

  • Kira HMAC bagi laluan URI dan SHA256, menggunakan SHA512 sebagai hash HMAC dan rahsia API yang dinyahkod sebagai kunci HMAC.

  • Kodkan HMAC ke dalam base64.

Contoh algoritma menggunakan pemboleh ubah yang ditunjukkan di atas adalah seperti berikut:

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

Hasilnya adalah nilai API-Sign.

Contoh Kod

Contoh minimum (tanpa pemeriksaan ralat) tetapi berfungsi sepenuhnya untuk menjana tandatangan pengesahan API bagi titik akhir API TradeBalance adalah seperti berikut:

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;

Perlu bantuan lebih lanjut?