【问题标题】:Kraken.com API: Generate the message signature in AngularJSKraken.com API:在 AngularJS 中生成消息签名
【发布时间】:2017-03-14 11:06:22
【问题描述】:

我正在尝试学习 Angular2,作为第一个练习,我想从 Kraken.com API 检索数据。 (我知道,我本可以选择更简单的:)

好吧,对于“公共”电话来说,它工作得很好。现在我正在尝试调用“私人”方法。 (那些需要认证)

正如这里所说: https://www.kraken.com/help/api

预期的签名是:

API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key

所以我正在尝试生成...没有成功...我不断收到此错误消息:

Kraken API returned an error: API:Invalid nonce

但我很确定我的 nonce 是正确的,所以我宁愿认为它与数据加密有关。

我找到了 here 一个可以完成这项工作的函数,但我不能在我的 Angular 项目中“按原样”使用它。

/**
 * This method returns a signature for a request as a Base64-encoded string
 * @param  {String}  path    The relative URL path for the request
 * @param  {Object}  request The POST body
 * @param  {Integer} nonce   A unique, incrementing integer
 * @return {String}          The request signature
 */
function getMessageSignature(path, request, nonce) {
    var message = querystring.stringify(request);
    var secret  = new Buffer(config.secret, 'base64');
    var hash    = new crypto.createHash('sha256');
    var hmac    = new crypto.createHmac('sha512', secret);

    var hash_digest = hash.update(nonce + message).digest('binary');
    var hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
}

这是我的代码:

private getMessageSignature(path: string, request: any, nonce: number) {
    //API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key

    var message = this.querystring.stringify(request);
    var secret  = this.CryptoJS.enc.Base64.parse(this.config.secret);
    var hash_digest = this.CryptoJS.SHA256(nonce + message);
    var hmac    = this.CryptoJS.HmacSHA512(path + hash_digest, secret).toString(this.CryptoJS.enc.Base64);
    return hmac;
}

【问题讨论】:

    标签: javascript angular encoding cryptography cryptojs


    【解决方案1】:

    问题很可能是path + hash_digest,这是一种类型不匹配,会导致奇怪的结果,因为hash_digest 将被十六进制编码,而不是在其二进制表示中使用。

    以下方法可能有效:

    var hmac = this.CryptoJS.HmacSHA512(path + hash_digest.toString(this.CryptoJS.enc.Latin1), secret).toString(this.CryptoJS.enc.Base64);
    

    但以下是更好的选择:

    var hmacHasher = this.CryptoJS.algo.HMAC.create(this.CryptoJS.algo.SHA512, secret);
    hmacHasher.update(path);
    hmacHasher.update(hash_digest);
    var hmac = hmacHasher.finalize().toString(this.CryptoJS.enc.Base64);
    

    【讨论】:

    • 你确定路径和请求编码正确了吗?
    • Arf,我的评论被截断了,我什至无法回答我自己的帖子。这是我的原始回复(带有我更新的代码)pastebin.com/zVcgGcsC 感谢 Artjom!
    • 不,想法。我没有看过 Kraken API
    【解决方案2】:

    哎哟!感谢Artjom的帮助,我终于成功调用了我的API!

    在实际显示代码之前,我必须更改一些内容: 在我的查询中,我将参数传递为

    application/x-www-form-urlencoded
    

    发送的实际数据与用于计算签名的数据不匹配。 所以我必须更正这一点,以便在我的请求正文中发送的数据与签名计算中使用的数据完全相同:

    let paramsStr = this.querystring.stringify(params);
    

    好的,最后,这是计算签名的代码:

    private getMessageSignature(path: string, request: any, nonce: number) {
            //API-Sign = Message signature using HMAC-SHA512 of 
            // (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    
            var message = this.querystring.stringify(request);
            var secret = this.CryptoJS.enc.Base64.parse(this.config.secret);
             var hash256 = this.CryptoJS.algo.SHA256.create();
            hash256.update(String(nonce));
            hash256.update(message);
    
            var hmacHasher = this.CryptoJS.algo.HMAC.create(this.CryptoJS.algo.SHA512, secret);
            hmacHasher.update(path);
            hmacHasher.update(hash256.finalize());
    
            var hashInBase64 = this.CryptoJS.enc.Base64.stringify(hmacHasher.finalize());
            return hashInBase64;
        }
    

    【讨论】:

    • 这不会创建与问题中提供的函数相同的签名
    猜你喜欢
    • 2018-03-04
    • 2014-04-06
    • 1970-01-01
    • 2018-07-05
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多