使用Matlab的Kraken API“无效签名”错误

时间:2017-05-30 09:24:04

标签: matlab hash

我正在尝试在MATLAB中实现比特币交换Kraken的API。不幸的是,我一直试图执行身份验证以检索私有用户数据。

特别是,我正在玩以下实施:Kraken API MATLAB client invalid signature error。 Kraken API的文档在这里:https://www.kraken.com/help/api

连接私人用户数据但我不断遇到错误:{“错误”:[“EAPI:无效签名”]}。有人可能会快速查看下面的实现并查找代码中的缺陷吗?或者是否有人成功实施了Matlab的Kraken API?

非常感谢!

% Private
 uri = '0/private/Balance';
 postdata='';
 [response,status] = kraken_authenticated(uri,postdata)

% test uri='0/private/AddOrder'
% test postdata='&pair=XBTEUR&type=buy&ordertype=limit&price=345.214&volume=0.65412&leverage=1.5&oflags=post'

function [response,status]=kraken_authenticated(uri,postdata)

% Generate URL
 url=['https://api.kraken.com/',uri];

% nonce
 nonce = num2str(floor((now-datenum('1970', 'yyyy'))*8640000000));
 key = ' '
 secret = ' '

 % 1st hash
 Opt.Method = 'SHA-256';
 Opt.Input = 'ascii';
 sha256string = DataHash(['nonce=',nonce,postdata],Opt);

% 2nd hash
 %sign = crypto([uri,sha256string], secret, 'HmacSHA512');
 sign = crypto([uri,sha256string], base64decode(secret), 'HmacSHA512')
 %sign = HMAC([uri,sha256string], base64decode(secret), 'SHA-512');

 %header_0=http_createHeader('Content-Type','application/x-www-form-urlencoded');
 header_1=http_createHeader('API-Key',key);
 header_2=http_createHeader('API-Sign',char(sign));
 header=[header_1 header_2];
 [response,status] = urlread2(url,'POST',['nonce=',nonce,postdata],header);

end

function signStr = crypto(str, key, algorithm)

import java.net.*;
 import javax.crypto.*;
 import javax.crypto.spec.*;
 import org.apache.commons.codec.binary.*

keyStr = java.lang.String(key);
 key = SecretKeySpec(keyStr.getBytes('UTF-8'), algorithm); 
 %key = SecretKeySpec(keyStr.getBytes(), algorithm) 

 mac = Mac.getInstance(algorithm);
 mac.init(key);
 toSignStr = java.lang.String(str);
 signStr = java.lang.String(Hex.encodeHex( mac.doFinal( toSignStr.getBytes('UTF-8'))))
 %signStr = java.lang.String(Hex.encodeHex( mac.doFinal( toSignStr.getBytes())))
 end

function header = http_createHeader(name,value)
 header = struct('name',name,'value',value);
 end

1 个答案:

答案 0 :(得分:2)

我实际上是在尝试用c ++做我的owm实现,而我在这里遇到了另一个错误,但是这是我在你的代码中注意到的可能原因:

第一个sha256哈希应该是nonce和postdata的串联。由于postdata也包含nonce,如果nonce值是123456789,那么你应该做(伪代码):

sha256("123456789nonce=123456789")

或在Matlab中:

sha256string = DataHash([nonce,'nonce=',nonce],Opt);

我希望它有所帮助。