我从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 似乎这些请求是相同的(除了签名和随机数,当然,它们会并且应该随每个请求而改变)。
答案 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不再抱怨。扎。