在 Kraken Rest api 中生成签名消息

问题描述 投票:0回答:2

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

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

目标是执行以下加密:

(URI 路径 + SHA256(随机数 + POST 数据))的 HMAC-SHA512 和 Base64 解码的秘密 API 密钥

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

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==

这里有许多 Phyton、Node 和 Golang 的代码示例 可以正常工作。但上面的 C# 代码没有生成预期的输出。

c# cryptography sha256 kraken.com hmacsha512
2个回答
2
投票

这会产生预期的输出。最后,我阅读了代码示例中使用的每种方法的 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));
}

0
投票

请遵循 Kraken API 的文档,其中提供了所需的带有私钥值的签名功能。

Kraken 签名机构

© www.soinside.com 2019 - 2024. All rights reserved.