生成驗證字串 (REST API)

上次更新時間: 2025年3月31日

部分 REST 端點允許執行敏感操作,例如下單或請求數碼資產提款。因此,這些私人端點只能透過加密請求呼叫,並且每個此類請求都必須包含一個驗證字串 (authent)。authent 是根據以下輸入計算的:

PostData

postData 是一個 "&" 串聯,形式為 <argument>=<value>,並且特定於每個 REST 端點。

範例

要操作端點 orderbook,您選擇值為
fi_xbtusd_180615 的引數 symbol。postData 則由 symbol=fi_xbtusd_180615 給出。

更新 v3 端點的驗證流程:自 2024 年 2 月 20 日起,為符合最佳實踐並確保更高的安全標準,我們將更新 /derivatives/* (v3) 端點的驗證流程。(詳情如下)

PostData 生成變更:


- 發佈前:用戶在為 Authent 生成進行 URL 編碼之前,需要對查詢字串參數進行雜湊處理,例如 `greeting=hello world`。


- 發佈後:驗證過程現在將要求對請求中出現的完整、已進行 URL 編碼的 URI 組件進行雜湊處理,例如 `greeting=hello%20world`。此方法增強了安全性並符合最佳實踐。
此更新對於 v3 batchorder 端點尤其重要,該端點在其查詢參數中接受 JSON 主體。


向後兼容性和未來計劃:


暫時而言,此變更向後兼容。平台將接受上述兩種 PostData 生成方法。然而,我們旨在未來逐步淘汰舊方法(對已解碼的查詢字串參數進行雜湊處理),以維持最高的安全標準。我們將在此變更之前提供充足的通知,並強烈鼓勵所有用戶盡快過渡到新方法,以確保服務的無縫連續性。

Nonce

nonce 是一個持續遞增的整數參數。一個好的 nonce 是以毫秒為單位的系統時間(字串格式)。我們的系統在短時間內容忍亂序的 nonce。Nonce 並非必需。

範例 1415957147987

許多驗證問題都與不正確的 nonce 有關。一對新的 API 金鑰將自動重設 nonce 並解決這些問題。

端點路徑

endpointPath 這是端點的 URL 擴展。

範例 /api/v3/orderbook

API 密鑰

api_secret 是按照上一節所述獲取的。

範例

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

根據這些輸入,authent 需要按以下方式計算:

  1. 1

    串聯

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    使用 SHA-256 演算法對步驟 1 的結果進行雜湊處理

  3. 3

    Base64 解碼您的 api_secret

  4. 4

    使用步驟 3 的結果,透過 HMAC-SHA-512 演算法對步驟 2 的結果進行雜湊處理

  5. 5

    Base64 編碼步驟 4 的結果

範例

以下顯示了 authent 在 Java 中的實作。有關不同程式語言的完整工作範例,請參閱「其他資源」部分。 public static String getAuthent(String postData, String nonce, String endpointPath, String secretKeyBase64)
{
Mac mac512;
MessageDigest sha256;
try {
SecretKey secretKey = new SecretKeySpec 
(Base64.decode(secretKeyBase64.getBytes()), HMAC_SHA_512);
mac512 = Mac.getInstance(HMAC_SHA_512);
mac512.init(secretKey);
sha256 = MessageDigest.getInstance("SHA-256");
} catch (IOException e) {
...
} catch (InvalidKeyException e) {
...
} catch (NoSuchAlgorithmException e) {
...
} sha256.update(postData.getBytes());
sha256.update(nonce.getBytes());
sha256.update(endpointPath.getBytes());
mac512.update(sha256.digest());
return Base64.encodeBytes(mac512.doFinal()).trim();
}

需要更多幫助?