อัลกอริทึมการยืนยันตัวตนสำหรับ Private Endpoint คืออะไร?

อัปเดตล่าสุด: 1 เมษายน 2568

การยืนยันตัวตน API จำเป็นทุกครั้งที่การเรียก API เข้าถึงบัญชีผ่านวิธีการ API ส่วนตัววิธีใดวิธีหนึ่ง

ตัวอย่างเช่น วิธีการจัดการบัญชี เช่น Balance, TradeBalance และ OpenOrders; วิธีการซื้อขาย AddOrder และ CancelOrder; และวิธีการระดมทุน เช่น DepositAddresses และ WithdrawInfo ล้วนเป็นวิธีการ API ส่วนตัวที่ต้องมีการยืนยันตัวตน API

API Keys และลายเซ็นเข้ารหัส

การยืนยันตัวตน API อิงตามคู่คีย์สาธารณะ/ส่วนตัว (รวมเรียกว่า API key) และลายเซ็นเข้ารหัสโดยใช้อัลกอริทึมแฮช เช่น SHA256 และ HMAC SHA512

ตัวอย่าง API key จะประกอบด้วยคีย์สาธารณะและคีย์ส่วนตัวที่คล้ายกับต่อไปนี้:

bash

Bash

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

โปรดทราบว่าตัวอย่างเหล่านี้ไม่สามารถใช้ได้เนื่องจากไม่ได้เชื่อมโยงกับบัญชี Kraken ใดๆ

ลายเซ็นเข้ารหัสถูกสร้างขึ้นแบบเรียลไทม์โดยโค้ดไคลเอ็นต์ API ข้อมูลสำหรับการเรียก API จะถูกส่งผ่านชุดของอัลกอริทึมแฮชและการยืนยันตัวตนข้อความ ซึ่งจะลงนามข้อมูลอย่างปลอดภัยโดยใช้ API secret (ส่วนส่วนตัวของ API key)

HTTP Headers

API key และลายเซ็นจะถูกส่งไปยัง API ผ่าน HTTP headers ที่กำหนดเอง API-Key และ API-Sign

API key ใช้เพื่อระบุว่ากำลังเข้าถึงบัญชีใด ดังนั้นค่าคีย์จึงเหมือนกันสำหรับการเรียก API ทุกครั้ง ลายเซ็นเข้ารหัสใช้เพื่อยืนยันตัวตนการเรียก API และคำนวณโดยใช้ค่าตัวแปร (เช่น nonce) ดังนั้นค่าลายเซ็นจึงแตกต่างกันสำหรับการเรียก API ทุกครั้ง

ตัวอย่างของ HTTP headers API-Key และ API-Sign มีดังนี้:

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

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

โปรดทราบว่าค่า API-Key เหมือนกับ public key ที่แสดงไว้ข้างต้นทุกประการ แต่ค่า API-Sign (ลายเซ็น) แตกต่างจาก private key ที่แสดงไว้ข้างต้น และจะเปลี่ยนเป็นค่าใหม่สำหรับการเรียก API แต่ละครั้ง

รหัสเทียมลายเซ็น

ใน เอกสาร API ของเราระบุว่าค่า API-Sign คือ "ลายเซ็นข้อความที่ใช้ HMAC-SHA512 ของ (URI path + SHA256(nonce + POST data)) และ API key ลับที่ถอดรหัส 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 data.

  • ถอดรหัส API secret (ส่วนส่วนตัวของ API key) จาก base64.

  • คำนวณ HMAC ของ URI path และ SHA256 โดยใช้ SHA512 เป็น HMAC hash และ API secret ที่ถอดรหัสแล้วเป็น HMAC key.

  • เข้ารหัส 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 endpoint ของ 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;

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่