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

InvalidKey at Kraken API with JS, not with Python

我从 Kraken API 获取余额的代码在 Python(基于 krakenex 库)中确实有效,但在 JS 版本(松散地基于 kraken-api 库,但用 crypto 库代替了 crypto-js)。错误始终是:无效密钥

即使我将 headers 和 Python 客户端发送的随机数复制到 Postman 中,我仍然得到无效密钥。

我相信签名和随机数是有效的,因为如果它们不是,Kraken 反驳说签名或随机数无效。

Javascript 的 fetch 与 Python3 requests 有什么不同吗?因为 body 和 headers 在其他方面是相同的。

生成授权数据的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 似乎请求是相同的(当然除了签名和随机数,它们会并且应该随着每个请求而改变)。

事实证明,这毕竟是签名,而 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 不再抱怨。扎哈