Saltar al contenido

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-epochNo debería haber pasado más de 5 minutos.
  • Authentication-Referenceno debe reutilizarse. Esta referencia es una cadena única, por ejemplo, un GUID.
  • Se crea una cadena con la concatenación de Authentication-Reference y Authentication-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 proporcionada
  • Authentication-Reference: Cadena aleatoria, diferente según la solicitud, puede ser un UUID