Quel est l'algorithme d'authentification pour les points de terminaison privés ?

Dernière mise à jour : 1 avr. 2025

L'authentification API est requise chaque fois qu'un appel API accède à un compte via l'une des méthodes API privées.

Par exemple, les méthodes de gestion de compte comme Balance, TradeBalance et OpenOrders ; les méthodes de trading AddOrder et CancelOrder ; et les méthodes de financement comme DepositAddresses et WithdrawInfo, sont toutes des méthodes API privées qui nécessiteraient une authentification API.

Clés API et signatures cryptographiques

L'authentification API est basée sur une paire de clés publique/privée (collectivement appelée clé API) et une signature cryptographique utilisant des algorithmes de hachage tels que SHA256 et HMAC SHA512.

Un exemple de clé API consisterait en une clé publique et une clé privée similaires à ce qui suit :

bash

Bash

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

Veuillez noter que ces exemples ne peuvent pas être utilisés car ils ne sont associés à aucun compte Kraken.

Les signatures cryptographiques sont créées en temps réel par le code client de l'API. Les données de l'appel API sont transmises à travers une série d'algorithmes de hachage et d'authentification de message qui signent de manière sécurisée les données en utilisant le secret API (la partie privée de la clé API).

En-têtes HTTP

La clé API et la signature sont fournies à l'API via les en-têtes HTTP personnalisés API-Key et API-Sign.

La clé API est utilisée pour identifier le compte auquel on accède, la valeur de la clé est donc identique pour chaque appel API. La signature cryptographique est utilisée pour authentifier l'appel API et est calculée à l'aide de valeurs variables (telles que le nonce), la valeur de la signature est donc différente pour chaque appel API.

Voici des exemples des en-têtes HTTP API-Key et API-Sign :

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

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

Notez que la valeur de l'API-Key est exactement la même que la clé publique affichée ci-dessus, mais que la valeur de l'API-Sign (la signature) est différente de la clé privée affichée ci-dessus et changera pour une nouvelle valeur à chaque appel API.

Pseudo-code de signature

Notre documentation API indique que la valeur API-Sign est une "signature de message utilisant HMAC-SHA512 de (chemin URI + SHA256(nonce + données POST)) et une clé API secrète décodée en base64", qui peut être séparée en plusieurs parties distinctes comme suit :

Variables

  • Chemin URI = URL de l'appel API sans 'https://api.kraken.com'.

  • nonce = Un identifiant unique dont la valeur doit augmenter à chaque appel API (souvent un horodatage UNIX, qui est l'heure actuelle en secondes (ou millisecondes pour une résolution plus élevée) depuis le 1er janvier 1970).

  • Données POST = Paires nom/valeur encodées sous forme de formulaire du nonce et des paramètres de la méthode API.

Voici des exemples des variables pour un appel à la méthode TradeBalance (notez que toutes les valeurs sont des chaînes de caractères, quelle que soit ce qu'elles représentent) :

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

  • nonce = "1540973848000"

  • Données POST = "nonce=1540973848000&asset=xbt"

Algorithme

  • Calculez le SHA256 du nonce et des données POST.

  • Décodez le secret de l'API (la partie privée de la clé API) à partir de base64.

  • Calculez le HMAC du chemin URI et du SHA256, en utilisant SHA512 comme hachage HMAC et le secret API décodé comme clé HMAC.

  • Encodez le HMAC en base64.

Voici un exemple de l'algorithme utilisant les variables présentées ci-dessus :

  • Base64Encode(HMAC-SHA512 de ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")) en utilisant Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") comme clé HMAC

Le résultat est la valeur API-Sign.

Exemples de code

Voici des exemples minimaux (sans vérification d'erreurs) mais entièrement fonctionnels de génération d'une signature d'authentification API pour le point de terminaison API 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;

Besoin d’aide supplémentaire ?