Estoy tratando de hacer uso de una API REST usando C#. El creador de API ha proporcionado bibliotecas de muestra en PHP, Ruby y Java. Me estoy colgando en una parte donde necesito generar un HMAC
.¿Cómo generar HMAC-SHA1 en C#?
Así es como se hace en las bibliotecas de muestra que han proporcionado.
PHP
hash_hmac('sha1', $signatureString, $secretKey, false);
Rubí
digest = OpenSSL::Digest::Digest.new('sha1')
return OpenSSL::HMAC.hexdigest(digest, secretKey, signatureString)
Java
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = null;
mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
byte[] bytes = mac.doFinal(signatureString.getBytes());
String form = "";
for (int i = 0; i < bytes.length; i++)
{
String str = Integer.toHexString(((int)bytes[i]) & 0xff);
if (str.length() == 1)
{
str = "0" + str;
}
form = form + str;
}
return form;
Aquí es mi att empt en C#.
No está funcionando.
ACTUALIZACIÓN: El siguiente ejemplo de C# funciona bien. Descubrí que el verdadero problema se debía a algunas diferencias entre plataformas en los caracteres de nueva línea en mi signatureString
.
var enc = Encoding.ASCII;
HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();
byte[] buffer = enc.GetBytes(signatureString);
return BitConverter.ToString(hmac.ComputeHash(buffer)).Replace("-", "").ToLower();
Resulta que mi código C# funciona bien.El problema real se debió a algunas diferencias entre plataformas en los caracteres de nueva línea en mi 'signatureString'. Voy a marcar esta pregunta para su eliminación. – jessegavin
En lugar de eliminar la pregunta, publique su código como respuesta y acéptelo. Esta pregunta es muy útil para quienes buscan hacer lo mismo. –
Agregué una actualización adicional sobre el texto "La API responde ..." para evitar posibles malentendidos –