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-epoch
não deve ter mais de 5 minutos.Authentication-Reference
não deve ser reutilizado. Esta referência é uma string única, por exemplo, um GUID.- Uma string é criada com a concatenação de
Authentication-Reference
eAuthentication-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 fornecidaAuthentication-Reference
: String aleatória, diferente por solicitação, pode ser um UUID