Thuật toán xác thực cho các điểm cuối riêng tư là gì?

Cập nhật lần cuối: 1 thg 4, 2025

Xác thực API là bắt buộc bất cứ khi nào một lệnh gọi API truy cập tài khoản thông qua một trong các phương thức API riêng tư.

Ví dụ: các phương thức quản lý tài khoản như Balance, TradeBalance và OpenOrders; các phương thức giao dịch AddOrder và CancelOrder; và các phương thức nạp/rút tiền như DepositAddresses và WithdrawInfo, đều là các phương thức API riêng tư yêu cầu xác thực API.

Khóa API và Chữ ký mật mã

Xác thực API dựa trên một cặp khóa công khai/riêng tư (gọi chung là khóa API) và một chữ ký mật mã sử dụng các thuật toán băm như SHA256 và HMAC SHA512.

Một ví dụ về khóa API sẽ bao gồm một khóa công khai và khóa riêng tư tương tự như sau:

bash

Bash

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

Lưu ý rằng các ví dụ này không thể được sử dụng vì chúng không liên kết với bất kỳ tài khoản Kraken nào.

Chữ ký mật mã được tạo theo thời gian thực bởi mã máy khách API. Dữ liệu cho lệnh gọi API được truyền qua một loạt các thuật toán băm và xác thực thông báo, sau đó ký an toàn dữ liệu bằng khóa bí mật API (phần riêng tư của khóa API).

Tiêu đề HTTP

Khóa API và chữ ký được cung cấp cho API thông qua các tiêu đề HTTP tùy chỉnh API-KeyAPI-Sign.

Khóa API được sử dụng để xác định tài khoản nào đang được truy cập, do đó giá trị khóa là giống nhau cho mọi lệnh gọi API. Chữ ký mật mã được sử dụng để xác thực lệnh gọi API và được tính toán bằng cách sử dụng các giá trị biến (chẳng hạn như nonce), do đó giá trị chữ ký là khác nhau cho mỗi lệnh gọi API.

Ví dụ về các tiêu đề HTTP API-Key và API-Sign như sau:

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

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

Lưu ý rằng giá trị API-Key hoàn toàn giống với khóa công khai được hiển thị ở trên, nhưng giá trị API-Sign (chữ ký) khác với khóa riêng tư được hiển thị ở trên và sẽ thay đổi thành một giá trị mới cho mỗi lệnh gọi API.

Mã giả chữ ký

Tài liệu API của chúng tôi nêu rõ rằng giá trị API-Sign là một "chữ ký thông báo sử dụng HMAC-SHA512 của (đường dẫn URI + SHA256(nonce + dữ liệu POST)) và khóa API bí mật được giải mã base64", có thể được tách thành một số phần riêng biệt như sau:

Các biến

  • Đường dẫn URI = URL của lệnh gọi API không có 'https://api.kraken.com'.

  • nonce = Một định danh duy nhất phải tăng giá trị theo mỗi lệnh gọi API (thường là dấu thời gian UNIX, là thời gian hiện tại tính bằng giây (hoặc mili giây để có độ phân giải cao hơn) kể từ ngày 1 tháng 1 năm 1970).

  • Dữ liệu POST = Các cặp tên/giá trị được mã hóa theo biểu mẫu của nonce và các tham số phương thức API.

Ví dụ về các biến cho một lệnh gọi đến phương thức TradeBalance như sau (lưu ý rằng tất cả các giá trị đều là giá trị chuỗi bất kể các giá trị đó đại diện cho điều gì):

  • Đường dẫn URI = "/0/private/TradeBalance"

  • nonce = "1540973848000"

  • Dữ liệu POST = "nonce=1540973848000&asset=xbt"

Thuật toán

  • Tính toán SHA256 của nonce và dữ liệu POST.

  • Giải mã khóa bí mật API (phần riêng tư của khóa API) từ base64.

  • Tính toán HMAC của đường dẫn URI và SHA256, sử dụng SHA512 làm hàm băm HMAC và khóa bí mật API đã giải mã làm khóa HMAC.

  • Mã hóa HMAC thành base64.

Ví dụ về thuật toán sử dụng các biến được hiển thị ở trên như sau:

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

Kết quả là giá trị API-Sign.

Mã ví dụ

Các ví dụ tối thiểu (không kiểm tra lỗi) nhưng đầy đủ chức năng về việc tạo chữ ký xác thực API cho điểm cuối API TradeBalance như sau:

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;

Bạn cần thêm trợ giúp?