Ga naar inhoud

HMAC berekenen

Verschillende API's (ZAGIS, en de POST-endpoints van PharmaPortal) vereisen een HMAC in een header ter integriteitscontrole. De ontvanger berekent dezelfde HMAC opnieuw; komen ze niet overeen, dan volgt een 401.

De HMAC is altijd op dezelfde manier opgebouwd:

Eigenschap Waarde
Algoritme HMAC met SHA-512
Sleutel De aan uw organisatie uitgereikte API-secret
Invoer De exacte bytes van het request body die u verstuurt
Codering Hexadecimaal (lowercase)
Header x-zagis-hmac, x-portal-hmac of x-zagis-offerte-hmac (zie de betreffende endpoint)

Bereken de HMAC over exact wat u verstuurt

Serialiseer uw JSON of CSV één keer naar een string/bytes, gebruik díe waarde zowel voor de HMAC als voor de request body, en verstuur haar ongewijzigd. Als u de body opnieuw serialiseert (andere spaties, volgorde of regeleindes) wijkt de HMAC af en krijgt u een 401.

Voorbeelden

De onderstaande voorbeelden berekenen de hex-HMAC van een request body met uw API-secret.

import hmac
import hashlib

secret = b"uw-api-secret"
body = b'{"zindexNummer": 12345678}'   # exact de bytes die u verstuurt

signature = hmac.new(secret, body, hashlib.sha512).hexdigest()
<?php
$secret = 'uw-api-secret';
$body   = '{"zindexNummer": 12345678}'; // exact de bytes die u verstuurt

$signature = hash_hmac('sha512', $body, $secret); // hex, lowercase
using System.Security.Cryptography;
using System.Text;

var secret = "uw-api-secret";
var body   = "{\"zindexNummer\": 12345678}"; // exact de bytes die u verstuurt

using var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(body));
var signature = Convert.ToHexString(hash).ToLowerInvariant();
const crypto = require("crypto");

const secret = "uw-api-secret";
const body = JSON.stringify({ zindexNummer: 12345678 }); // stuur exact deze string

const signature = crypto
  .createHmac("sha512", secret)
  .update(body, "utf8")
  .digest("hex");
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

String secret = "uw-api-secret";
String body   = "{\"zindexNummer\": 12345678}"; // exact de bytes die u verstuurt

Mac mac = Mac.getInstance("HmacSHA512");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA512"));
byte[] hash = mac.doFinal(body.getBytes(StandardCharsets.UTF_8));

StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String signature = sb.toString();

Volledig request (voorbeeld)

Bereken de HMAC over dezelfde body die u verstuurt en zet hem in de juiste header:

BODY='{"zindexNummer": 12345678}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha512 -hmac "uw-api-secret" | awk '{print $2}')

curl -X POST https://demo.zagis.nl/api/zagis/prijsCheck \
  -H "x-zagis-key: <uw-api-key>" \
  -H "x-zagis-hmac: $SIG" \
  -H "content-type: application/json" \
  --data "$BODY"
SIG=$(openssl dgst -sha512 -hmac "uw-api-secret" gip.csv | awk '{print $2}')

curl -X POST https://demo.zagis.nl/api/zagis/gip \
  -H "x-zagis-key: <uw-api-key>" \
  -H "x-zagis-hmac: $SIG" \
  -H "content-type: text/csv" \
  --data-binary @gip.csv

Testen

Neem voor een API-key en API-secret tijdig contact met ons op via info@zagis.nl.