Ejemplo de Script: Generar HASH HMAC Usando un Token Privado
Este ejemplo ilustra el uso de un complemento de C# con una API REST para la autenticación. Este ejemplo específico requirió generar un HASH HMAC utilizando un token privado, una referencia única por solicitud y una marca de tiempo de época.
Para uso de comunicación, se proporciona un 'token privado' (y una referencia de organización). Mantenga este token en secreto.
Cada solicitud contendrá 3 encabezados (adicionales):
Authentication-Reference
: (Cadena) - Una referencia, debe ser única por solicitud. El formato no está especificado.Authentication-epoch
: (Número) - Marca de tiempo de época Unix en número de segundos a partir del 1/1/1970.Authentication-Signature
: (Cadena) - La combinación firmada de referencia y época que utiliza el token privado.
Para validar una solicitud, se necesitan los siguientes pasos:
Authentication-epoch
No debería haber pasado más de 5 minutos.Authentication-Reference
no debe reutilizarse. Esta referencia es una cadena única, por ejemplo, un GUID.- Se crea una cadena con la concatenación de
Authentication-Reference
yAuthentication-epoch
. - Esta cadena se codifica según el resumen SHA512.
- El resumen está codificado en HMAC con un 'token privado' como clave (conocido tanto por el remitente como por el receptor).
- El valor hexadecimal de este hash (en minúsculas, sin espacios ni guiones) y debe coincidir con el
Authentication-Signature
.
Ejemplo de Secuencia de Comandos
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 Extremo Necesarios
Authentication-Private-Key
: La clave privada proporcionadaAuthentication-Reference
: Cadena aleatoria, diferente según la solicitud, puede ser un UUID