¿Cuál es el algoritmo de autenticación para los puntos finales privados?

Última actualización: 1 abr 2025

La autenticación de la API es necesaria cada vez que una llamada a la API accede a una cuenta a través de uno de los métodos privados de la API.

Por ejemplo, los métodos de gestión de cuentas como Balance, TradeBalance y OpenOrders; los métodos de trading AddOrder y CancelOrder; y los métodos de financiación como DepositAddresses y WithdrawInfo, son todos métodos privados de la API que requerirían autenticación de la API.

Claves API y Firmas Criptográficas

La autenticación de la API se basa en un par de claves pública/privada (conocido colectivamente como clave API) y una firma criptográfica que utiliza algoritmos hash como SHA256 y HMAC SHA512.

Un ejemplo de clave API consistiría en una clave pública y privada similar a la siguiente:

bash

Bash

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

Tenga en cuenta que estos ejemplos no se pueden utilizar ya que no están asociados a ninguna cuenta de Kraken.

Las firmas criptográficas son creadas en tiempo real por el código del cliente de la API. Los datos para la llamada a la API se pasan a través de una serie de algoritmos hash y de autenticación de mensajes que firman de forma segura los datos utilizando el secreto de la API (la parte privada de la clave API).

Encabezados HTTP

La clave API y la firma se proporcionan a la API a través de los encabezados HTTP personalizados API-Key y API-Sign.

La clave API se utiliza para identificar a qué cuenta se está accediendo, por lo que el valor de la clave es idéntico para cada llamada a la API. La firma criptográfica se utiliza para autenticar la llamada a la API y se calcula utilizando valores variables (como el nonce), por lo que el valor de la firma es diferente para cada llamada a la API.

Los ejemplos de los encabezados HTTP API-Key y API-Sign son los siguientes:

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

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

Tenga en cuenta que el valor de API-Key es exactamente el mismo que la clave pública mostrada anteriormente, pero que el valor de API-Sign (la firma) es diferente de la clave privada mostrada anteriormente y cambiará a un nuevo valor para cada llamada a la API.

Pseudocódigo de Firma

Nuestra documentación de la API establece que el valor de API-Sign es una "firma de mensaje que utiliza HMAC-SHA512 de (ruta URI + SHA256(nonce + datos POST)) y clave API secreta decodificada en base64", que se puede separar en varias partes distintas de la siguiente manera:

Variables

  • Ruta URI = URL de la llamada a la API sin 'https://api.kraken.com'.

  • nonce = Un identificador único que debe aumentar de valor con cada llamada a la API (a menudo una marca de tiempo UNIX, que es la hora actual en segundos (o milisegundos para mayor resolución) desde el 1 de enero de 1970).

  • Datos POST = Pares nombre/valor codificados en formulario del nonce y los parámetros del método de la API.

Los ejemplos de las variables para una llamada al método TradeBalance son los siguientes (tenga en cuenta que todos los valores son cadenas de texto, independientemente de lo que representen):

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

  • nonce = "1540973848000"

  • POST data = "nonce=1540973848000&asset=xbt"

Algoritmo

  • Calcule el SHA256 del nonce y los datos POST.

  • Decodifique el secreto de la API (la parte privada de la clave API) de base64.

  • Calcule el HMAC de la ruta URI y el SHA256, utilizando SHA512 como hash HMAC y el secreto de la API decodificado como clave HMAC.

  • Codifique el HMAC en base64.

Un ejemplo del algoritmo utilizando las variables mostradas anteriormente es el siguiente:

  • Base64Encode(HMAC-SHA512 de ("/0/private/TradeBalance" + SHA256("1540973848000nonce=1540973848000&asset=xbt")) utilizando Base64Decode("FRs+gtq09rR7OFtKj9BGhyOGS3u5vtY/EdiIBO9kD8NFtRX7w7LeJDSrX6cq1D8zmQmGkWFjksuhBvKOAWJohQ==") como clave HMAC

El resultado es el valor API-Sign.

Código de ejemplo

A continuación se muestran ejemplos mínimos (sin comprobación de errores) pero totalmente funcionales de cómo generar una firma de autenticación de API para el punto final de la 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;

¿Necesita más ayuda?