私有端点的身份验证算法是什么?

上次更新时间: 2025年4月1日

当 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 密钥和签名通过自定义 HTTP 标头 API-KeyAPI-Sign 提供给 API。

API 密钥用于识别正在访问的账户,因此每个 API 调用的密钥值都是相同的。加密签名用于验证 API 调用,并使用变量值(例如 nonce)计算,因此每个 API 调用的签名值都不同。

API-Key 和 API-Sign HTTP 标头示例如下:

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

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

请注意,API-Key 值与上面显示的公钥完全相同,但 API-Sign 值(签名)与上面显示的私钥不同,并且每次 API 调用都会更改为新值。

签名伪代码

我们的 API 文档 指出 API-Sign 值是 “使用 HMAC-SHA512 对(URI 路径 + SHA256(nonce + POST 数据))和 base64 解码的秘密 API 密钥进行的消息签名”,可分为以下几个不同的部分:

变量

  • URI 路径 = 不带 'https://api.kraken.com' 的 API 调用 URL。

  • nonce = 一个唯一标识符,其值必须随每次 API 调用而增加(通常是 UNIX 时间戳,即自 1970 年 1 月 1 日以来的当前时间,以秒为单位(或以毫秒为单位以获得更高分辨率))。

  • POST 数据 = nonce 和 API 方法参数的表单编码名称/值对。

调用 TradeBalance 方法的变量示例如下(请注意,无论值代表什么,所有值都是字符串值):

  • URI 路径 = "/0/private/TradeBalance"

  • nonce = "1540973848000"

  • POST 数据 = "nonce=1540973848000&asset=xbt"

算法

  • 计算 nonce 和 POST 数据的 SHA256。

  • 从 base64 解码 API 密钥(API 密钥的私有部分)。

  • 使用 SHA512 作为 HMAC 哈希,并使用解码后的 API 密钥作为 HMAC 密钥,计算 URI 路径和 SHA256 的 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 值。

示例代码

以下是为 TradeBalance API 端点生成 API 身份验证签名的最小(无错误检查)但功能齐全的示例:

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;

需要更多帮助吗?