using System.Security.Cryptography;
Console.WriteLine(HMACValidation.HashIsValid("secret", "payload", "uC/LeRrOxXhZuYm0MKgmSIzi5Hn9+SMmvQoug3WkK6Q="));
public static void DocuSign()
var secretKey = "secret";
var verifyKey = "uC/LeRrOxXhZuYm0MKgmSIzi5Hn9+SMmvQoug3WkK6Q=";
var computedHashString = ComputeHash(secretKey, payload);
var valid = computedHashString.Equals(verifyKey);
Console.WriteLine(valid);
private static string ComputeHash(string secret, string payload)
byte[] bytes = Encoding.UTF8.GetBytes(secret);
HMAC Mac = new HMACSHA256(bytes);
bytes = Encoding.UTF8.GetBytes(payload);
return Convert.ToBase64String(Mac.ComputeHash(bytes));
public static class HMACValidation
public static string ComputeHash(string secret, string payload)
byte[] bytes = Encoding.UTF8.GetBytes(secret);
HMAC hmac = new HMACSHA256(bytes);
bytes = Encoding.UTF8.GetBytes(payload);
return Convert.ToBase64String(hmac.ComputeHash(bytes));
public static bool HashIsValid(string secret, string payload, string verify)
ReadOnlySpan<byte> hashBytes = Convert.FromBase64String(ComputeHash(secret, payload));
ReadOnlySpan<byte> verifyBytes = Convert.FromBase64String(verify);
return CryptographicOperations.FixedTimeEquals(hashBytes, verifyBytes);