Ir para o conteúdo

Exemplo de Script - Gerar HASH HMAC Usando Token Privado

Este exemplo ilustra o uso de um plugin C# com uma API REST para autenticação. Este exemplo específico exigiu a geração de um HMAC HASH usando um token privado, uma referência única por solicitação e um carimbo de data/hora de época.

Para uso de comunicação, um 'token privado' (e uma referência de organização) é fornecido. Mantenha esse token em segredo.

Cada solicitação conterá 3 cabeçalhos (extras):

  • Authentication-Reference: (String) - Uma referência, deve ser única por solicitação. O formato não é especificado.
  • Authentication-epoch: (Número) - Um carimbo de data/hora Unix epoch em número de segundos de 1/1/1970.
  • Authentication-Signature: (String) - A combinação assinada de Reference e epoch usando o token privado.

Para validar uma solicitação, as seguintes etapas são necessárias:

  • Authentication-epochnão deve ter mais de 5 minutos.
  • Authentication-Referencenão deve ser reutilizado. Esta referência é uma string única, por exemplo, um GUID.
  • Uma string é criada com a concatenação de Authentication-Reference e Authentication-epoch.
  • Esta string é hash de acordo com o resumo SHA512.
  • O resumo é codificado em HMAC com um 'token privado' como chave (conhecido pelo remetente e pelo destinatário).
  • O valor hexadecimal deste hash (letras minúsculas, sem espaços ou traços), e deve corresponder ao Authentication-Signature.

Exemplo de Script

using System;
using System.Text;
using System.Security.Cryptography;
var epoch = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
string privateKey = Request.Headers["Authentication-Private-Key"]; 
string reference = Request.Headers["Authentication-Reference"] + epoch;
HMAC hMAC=new HMACSHA512(Encoding.UTF8.GetBytes(privateKey));
byte[] tokens = hMAC.ComputeHash(Encoding.UTF8.GetBytes(reference));
string authToken = BitConverter.ToString(tokens).Replace( "-", "").
ToLower();
Request.Headers["Authentication-Signature"] = authToken;
Request.Headers["Authentication-Epoch"] = epoch.ToString();
Request.Headers.Remove("Authentication-Private-Key");

Parâmetros de Endpoint Necessários

  • Authentication-Private-Key: A chave privada fornecida
  • Authentication-Reference: String aleatória, diferente por solicitação, pode ser um UUID