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.zondacrypto.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:

KluczOpis
API-KeyKlucz publiczny w jawnej formie.
API-HashHMAC("SHA512", klucz_publiczny + aktualny_timestamp + parametry_metody_JSON, klucz prywatny)
operation-idJednorazowy, losowo wygenerowany UUID operacji.
Request-TimestampAktualny czas w formacie UNIX Timestamp. Ta sama wartość musi zostać użyta do wygenerowania hasza.
Content-TypeDwuczęś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();

    }
}