Punkty końcowe, które wymagają autoryzacji użytkownika będą dalej nazywane “metodami prywatnymi”. By z nich korzystać, należy utworzyć parę kluczy umożliwiających autoryzację tworzonej aplikacji. Można to zrobić pod adresem https://auth.zonda.exchange/settings/api
Konkretna para kluczy powinna mieć uprawnienia tylko do modułów, z których rzeczywiście będzie korzystać. Parametry muszą zostać wysłane w formacie JSON, który umożliwia wygenerowanie hasza.

Aby odnieść się do dowolnej metody prywatnej, w nagłówku muszą znaleźć się następujące parametry autoryzacyjne:

Klucz

Opis

API-Key

Klucz publiczny w jawnej formie.

API-Hash

HMAC("SHA512", klucz_publiczny + aktualny_timestamp + parametry_metody_JSON, klucz prywatny)

operation-id

Jednorazowy, losowo wygenerowany UUID operacji.

Request-Timestamp

Aktualny czas w formacie UNIX Timestamp. Ta sama wartość musi zostać użyta do wygenerowania hasza.

Content-Type

Dwuczęściowy identyfikator formatu plików, domyślnie: application/json.

Wartość API-Hash jest wygenerowaną wartością HMAC przy użyciu funkcji haszującej algorytmem SHA512 dla następujących danych:

  • Klucz publiczny
  • Aktualny czas w formacie UNIX Timestamp
  • Dane, które zostały przesłane w formacie JSON (tylko w przypadku metod POST)
  • Klucz prywatny (w niektórych bibliotekach podawany jest on jako osobny parametr będący kluczem szyfrowania)

Przykładowe wartości autoryzacji oraz gotowy kod:

API-Key: 12345f6f-1b1d-1234-a973-a10b1bdba1a1
API-Hash: 8892f16e0713c5f3e3d7e9fa26c5a5f2817b09fc48fece72ed5712ae33547c92e91e735b1818397136beea760efae61d1449a93e48ee2f80789dfa24830ef720
operation-id: 78539fe0-e9b0-4e4e-8c86-70b36aa93d4f
Request-Timestamp: 1529897422
Content-Type: application/json
<?php
class bitbayAPI

{
    private $pubkey = '';
    private $privkey = '';
  
    public function __construct($pubkey, $privkey)
    {
        $this->pubkey = $pubkey;
        $this->privkey = $privkey;
    }

    public function GetUUID($data)
    {
        assert(strlen($data) == 16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data) , 4));
    }

    public function callApi($method, $params = null, $type = 'GET')
    {
        $post = null;
        if (($type == 'GET') && is_array($params)):
            $method = $method . '?query=' . urlencode(json_encode($params));
        elseif (($type == 'POST' || $type == 'PUT' || $type == 'DELETE') && is_array($params) && (count($params) > 0)):
            $post = json_encode($params);
        endif;
        $time = time();
        $sign = hash_hmac("sha512", $this->pubkey . $time . $post, $this->privkey);
        $headers = array(
            'API-Key: ' . $this->pubkey,
            'API-Hash: ' . $sign,
            'operation-id: ' . GetUUID(random_bytes(16)) ,
            'Request-Timestamp: ' . $time,
            'Content-Type: application/json'
        );
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, 'https://api.bitbay.net/rest/' . $method);
        if ($type == 'POST' || $type == 'PUT' || $type == 'DELETE') {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        }

        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        $ret = curl_exec($curl);
        $info = curl_getinfo($curl);
        return $ret;
    }
}
'use strict'

const uuidv4 = require('uuid/v4');
const crypto = require('crypto');

const apiKey = '48249e33-fbad-4805-a752-a82fe216e933';
const apiSecret = '12cd3901-1d4f-4b24-82ef-fbbc36638b7c';
var body = null;

function getHash(apiKey, timestamp, apiSecret, body) {
    const hmac = crypto.createHmac('sha512', apiSecret);

    if (body)
        hmac.update(apiKey + timestamp + JSON.stringify(body));
    else
        hmac.update(apiKey + timestamp);

    return hmac.digest('hex');
};

let timestamp = Date.now();
var headers = {
    'API-Key': apiKey,
    'API-Hash': getHash(apiKey, timestamp, apiSecret, body),
    'operation-id': uuidv4(),
    'Request-Timestamp': timestamp,
    'Content-Type': 'application/json'
};
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public abstract class APIHashGenerator {

  public static String gemerate(String data, String key) {

        String result = "";

        try{
            byte [] byteKey = key.getBytes("UTF-8");
            final String HMAC_SHA512 = "HmacSHA512";
            Mac sha512_HMAC = null;
            sha512_HMAC = Mac.getInstance(HMAC_SHA512);
            SecretKeySpec keySpec = new SecretKeySpec(byteKey, HMAC_SHA512);
            sha512_HMAC.init(keySpec);
            byte [] mac_data = sha512_HMAC.
                    doFinal(data.getBytes("UTF-8"));
            result = bytesToHex(mac_data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
  
    private static String bytesToHex(byte[] hashInBytes) {

        StringBuilder sb = new StringBuilder();

        for (byte b : hashInBytes) {
            sb.append(String.format("%02x", b));
        }

        return sb.toString();

    }
}