2016-03-14 89 views
1

我试图对Kraken私有端点进行一些认证调用,但没有成功。我仍然收到错误EAPI:签名无效。 有人知道有什么问题吗?Kraken API MATLAB客户端无效签名错误

下面的代码:

function [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' 

    url=['https://api.kraken.com/',uri]; 
    % nonce 
    nonce = num2str(floor((now-datenum('1970', 'yyyy'))*8640000000)); 
    [key,secret]=key_secret('kraken'); 
    % 1st hash 
    Opt.Method = 'SHA-256'; 
    Opt.Input = 'ascii'; 
    sha256string = DataHash(['nonce=',nonce,postdata],Opt); 
    % 2nd hash 
    sign = crypto([uri,sha256string], secret, 'HmacSHA512'); 

    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); 
    mac = Mac.getInstance(algorithm); 
    mac.init(key); 
    toSignStr = java.lang.String(str); 
    signStr = java.lang.String(Hex.encodeHex(mac.doFinal(toSignStr.getBytes('UTF-8')))); 

end 

我也试过

sign = crypto([uri,sha256string], base64decode(secret), 'HmacSHA512'); 

但没有成功。

这是指南验证呼叫HTTPS标题:

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

这是指南验证呼叫POST数据:

nonce = always increasing unsigned 64 bit integer 
otp = two-factor password (if two-factor enabled, otherwise not required) 

我试图通过“随机数”参数或所有参数“postdata”POST数据但没有成功。

感谢您的帮助。

回答

2

的问题是在功能上的加密这里:

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

为编码从海怪私钥Base64是不一定是UTF-8编码,则无法使用UTF-8编码提取关键,并通过UTF- 8字符串到SecretKeySpec函数。您需要使用字节数组。

类似问题

https://code.google.com/p/google-apps-script-issues/issues/detail?id=5113 https://code.google.com/p/google-apps-script-issues/issues/detail?id=3121

解决方案的javascript

github.com/Caligatio/jsSHA

+0

感谢。是的,这是问题所在。我对Java加密方法不太熟悉,所以我忽略了它。 无论如何,如果有人要通过Matlab使用Kraken API,另一个解决方案就是使用现成的Python API客户端即。 https://github.com/veox/python2-krakenex。 –

+0

嗨 - 您是如何将python解决方案与matlab连接起来的(具体如何与它进行交互?)关于如何解决matlab中的字节数组问题以获得上述建议的工作方式,可能有其他想法吗?谢谢! – Benvaulter

+0

你应该看看matlab和python是如何集成的:https://stackoverflow.com/questions/39896899/calling-python-from-matlab – f334e31bd0