在 Kraken Rest 中生成签名消息 api

Generate signed message in Kraken Rest api

我正在使用私钥向 Kraken api 发送请求。问题是,生成的签名不符合预期。

请注意,您在下方看到的密钥只是一个示例。但它应该产生预期的输出。如果是这样,那就意味着代码是正确的,并且可以使用实际的密钥。

目标是执行以下加密:

HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key

到目前为止,我已经写了这段代码:

public class KrakenApi
{
    private static string ApiPrivateKey = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg==";

    public static string GetKrakenSignature(string urlPath, ulong nonce, Dictionary<string,string> data)
    {
        var hash256 = new SHA256Managed();
        var postData = string.Join("&", data.Select(e => e.Key + "=" + e.Value).ToArray());
        var encoded = Encoding.UTF8.GetBytes(nonce + postData);
        var message = Encoding.UTF8.GetBytes(urlPath).Concat(hash256.ComputeHash(encoded).ToArray());
        var secretDecoded = (System.Convert.FromBase64String(ApiPrivateKey));
        var hmacsha512 = new HMACSHA512(secretDecoded);
        var hash = hmacsha512.ComputeHash(secretDecoded.Concat(message).ToArray());
        return System.Convert.ToBase64String(hash);
    }
}

用法:

var data = new Dictionary<string, string> {
    { "nonce", "1616492376594" },
    { "ordertype", "limit" },
    { "pair", "XBTUSD" },
    { "price", "37500" },
    { "type", "buy" },
    { "volume", "1.25" }
};

var signature = KrakenApi.GetKrakenSignature("/0/private/AddOrder", ulong.Parse(data["nonce"]), data);

Console.WriteLine(signature);

输出应该是:

4/dpxb3iT4tp/ZCVEwSnEsLxx0bqyhLpdfOpc6fn7OR8+UClSV5n9E6aSS8MPtnRfp32bAb0nmbRn6H8ndwLUQ==

有许多 code samples for Phyton, Node and Golang here 可以正常工作。但是上面的 C# 代码没有生成预期的输出。

这会生成预期的输出。最后,我阅读了代码示例中使用的每个方法的 Python 文档,并在 C# 中重现了相同的步骤。

public static string GetKrakenSignature(string urlPath, ulong nonce, Dictionary<string,string> data)
{
    var hash256 = new SHA256Managed();
    var postData = string.Join("&", data.Select(e => e.Key + "=" + e.Value).ToArray());
    var encoded = Encoding.UTF8.GetBytes(nonce + postData);
    var message = Encoding.UTF8.GetBytes(urlPath).Concat(hash256.ComputeHash(encoded)).ToArray();
    var mac = new HMACSHA512(Convert.FromBase64String(ApiPrivateKey));            
    return Convert.ToBase64String(mac.ComputeHash(message));
}