使用JS而不是Python的Kraken API上的InvalidKey

时间:2018-09-26 21:01:49

标签: javascript python python-requests fetch kraken.com

我从Kraken API中获得余额的代码确实可以在Python(基于krakenex库)中运行,但不适用于JS版本(基于kraken-api库,但基于crypto库)代替crypto-js)。错误始终是:无效的密钥

即使我将Python客户端发送的标头和随机数复制到Postman中,也会收到无效密钥。

我认为签名和随机数是有效的,因为当签名和随机数无效时,Kraken反驳说签名或随机数均无效。

Java的fetch与Python3 requests有什么不同吗?因为正文和标题在其他方面是相同的。

生成身份验证数据的JS代码:

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = qs.stringify(request);
    console.log(message);

    const secret_buffer = btoa(secret);
    const hash = CryptoJS.algo.SHA256.create();
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    const hash_digest = hash.update(nonce + message).finalize().toString(CryptoJS.enc.Hex);
    const hmac_digest = hmac.update(path + hash_digest).finalize().toString(CryptoJS.enc.Base64);

    // CANNOT USE ORIGINAL LIB CODE (Buffer, got and crypto not supported)
    // const secret_buffer = new Buffer(secret, 'base64');
    // const hash = new crypto.createHash('sha256');
    // const hmac = new crypto.createHmac('sha512', secret_buffer);
    // const hash_digest = hash.update(nonce + message).digest('binary');
    // const hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
};

更新: 实际上,以下观察很奇怪:

  • 正确的密钥+正确的签名=“错误的密钥”
  • 错误的密钥+正确的签名=“错误的密钥”
  • 密钥不正确+签名不正确=“密钥不正确”
  • 正确的密钥+错误的签名=“无效的签名”

给什么?

更新2 似乎这些请求是相同的(除了签名和随机数,当然,它们会并且应该随每个请求而改变)。

enter image description here

1 个答案:

答案 0 :(得分:0)

最终证明这是签名,而Kraken根本没有给出非常准确的答复(这很有道理,但是如果您想弄清楚的话会很痛苦)。最终,我只能使用CryptoJS重写代码:

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);
    const hash = CryptoJS.SHA256(nonce + message);
    const secret_buffer = CryptoJS.enc.Base64.parse(secret);
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    hmac.update(path, secret_buffer);
    hmac.update(hash, secret_buffer);
    return hmac.finalize().toString(CryptoJS.enc.Base64);
};

这将产生正确的签名,并且Kraken不再抱怨。扎。