Bitstamp - nueva autenticación en C # - firma
La nueva autenticación de bitstamp dice lo siguiente:
La firma es un mensaje codificado HMAC-SHA256 que contiene: nonce, ID de cliente y clave de API. El código HMAC-SHA256 debe generarse usando una clave secreta que se generó con su clave API. Este código debe convertirse a su representación hexadecimal (64 caracteres en mayúscula). Ejemplo (Python): mensaje = nonce + client_id + api_key signature = hmac.new (API_SECRET, msg = message, digestmod = hashlib.sha256) .hexdigest (). Superior()
Fuente:enlazar
Tengo el siguiente código para agregar la nueva firma (y otros parámetros):
public void AddApiAuthentication(RestRequest restRequest)
{
var nonce = DateTime.Now.Ticks;
var signature = GetSignature(nonce, apiKey, apiSecret, clientId);
restRequest.AddParameter("key", apiKey);
restRequest.AddParameter("signature", signature);
restRequest.AddParameter("nonce", nonce);
}
private string GetSignature(long nonce, string key, string secret, string clientId)
{
string msg = string.Format("{0}{1}{2}", nonce,
clientId,
key);
return ByteArrayToString(SignHMACSHA256(secret, StrinToByteArray(msg))).ToUpper();
}
public static byte[] SignHMACSHA256(String key, byte[] data)
{
HMACSHA256 hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes(key));
return hashMaker.ComputeHash(data);
}
public static byte[] StrinToByteArray(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public static string ByteArrayToString(byte[] hash)
{
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
Y luego me sale este error:
{"error": "Firma inválida"}
¿Alguien tiene una idea de cuál podría ser el problema? Revisé mis parámetros 100 veces y no están mal. ¿Tal vez alguien consiguió un código de trabajo (en C #) para la nueva autenticación?
ACTUALIZAR
Abhinav tenía razón, el método StringToByteArray estaba equivocado (no solo el error tipográfico: P), el código de trabajo es:
public static byte[] StrinToByteArray(string str)
{
return System.Text.Encoding.ASCII.GetBytes(str);
}