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;
};
更新:
事实上,以下观察结果很奇怪:
- 正确的密钥+正确的签名="incorrect key"
- 不正确的密钥 + 正确的签名 = "incorrect key"
- 错误的密钥 + 错误的签名 = "incorrect key"
- 正确的密钥 + 错误的签名 = "invalid signature"
什么给了?
更新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 不再抱怨。扎哈
我从 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;
};
更新: 事实上,以下观察结果很奇怪:
- 正确的密钥+正确的签名="incorrect key"
- 不正确的密钥 + 正确的签名 = "incorrect key"
- 错误的密钥 + 错误的签名 = "incorrect key"
- 正确的密钥 + 错误的签名 = "invalid signature"
什么给了?
更新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 不再抱怨。扎哈