将 Python/JS 翻译成 Java - JSON & HMAC

Posted

技术标签:

【中文标题】将 Python/JS 翻译成 Java - JSON & HMAC【英文标题】:Translating Python/JS to Java - JSON & HMAC 【发布时间】:2018-02-08 10:00:31 【问题描述】:

我正在尝试将以下 Python 示例转换为 Java 代码,但在我创建的 HTTP 帖子和/或 HMAC 签名的格式方面出现错误。如果有人能指出我可能做错的部分,那将非常有帮助。谢谢!

原始 Python 示例:

    PAYLOAD = 
      "access_token": ACCESS_TOKEN,
      "price": 500000,
      "qty": 0.1,
      "currency", "btc"
    

    def get_encoded_payload(payload):
      payload[u'nonce'] = int(time.time()*1000)

      dumped_json = json.dumps(payload)
      encoded_json = base64.b64encode(dumped_json)
      return encoded_json

    def get_signature(encoded_payload, secret_key):
      signature = hmac.new(str(secret_key).upper(), str(encoded_payload), hashlib.sha512);
      return signature.hexdigest()

    def get_response(url, payload):
      encoded_payload = get_encoded_payload(payload)
      headers = 
        'Content-type': 'application/json',
        'X-COINONE-PAYLOAD': encoded_payload,
        'X-COINONE-SIGNATURE': get_signature(encoded_payload, SECRET_KEY)
      
      http = httplib2.Http()
      response, content = http.request(URL, 'POST', headers=headers, body=encoded_payload)
      return content

    def get_result():
      content = get_response(URL, PAYLOAD)
      content = json.loads(content)

      return content

    if __name__   == "__main__":
        print get_result()

原始JS示例:

    var crypto = require('crypto');
var request = require('request');
var ACCESS_TOKEN = '';
var SECRET_KEY = '';
var url = 'https://api.coinone.co.kr/v2/order/limit_buy/';
  var payload = 
  "access_token": ACCESS_TOKEN,
  "price": 500000,
  "qty": 0.1,
  "currency": "btc",
  "nonce": Date.now()
;

payload = new Buffer(JSON.stringify(payload)).toString('base64');

var signature = crypto
  .createHmac("sha512", SECRET_KEY.toUpperCase())
  .update(payload)
  .digest('hex');

var headers = 
  'content-type':'application/json',
  'X-COINONE-PAYLOAD': payload,
  'X-COINONE-SIGNATURE': signature
;

var options = 
  url: url,
  headers: headers,
  body: payload
;

request.post(options,
  function(error, response, body) 
    console.log(body);
);

我的 Java 代码:

    long nonce = (new Date()).getTime();
    JSONObject json = new JSONObject();
    json.put("currency", "BTC");
    json.put("price", 3000000);
    json.put("qty", 0.01);
    json.put("access_token", publicKey);
    json.put("nonce", nonce);

    System.out.println(json.toString());

    Client client = ClientBuilder.newClient();
    Entity<String> payload = Entity.json(json.toString());
    String message = json.toString(); 
    Response response = client.target(baseAddress+apiAddress)
      .request(MediaType.APPLICATION_JSON_TYPE)
      .header("content-type", "application/json")
      .header("accept", "application/json")
      .header("X-COINONE-PAYLOAD", payload)
      .header("X-COINONE-SIGNATURE", CreateToken(message, privateKey.toUpperCase()))
      .post(payload);

    String body = response.readEntity(String.class);
    System.out.println(body);

    ///////////
    private static String CreateToken(String message, String secretKey)

    String hash = "";
    try     

        Mac sha512_HMAC = Mac.getInstance("HmacSHA512");
        SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA512");
        sha512_HMAC.init(secret_key);

        hash = Base64.encodeBase64String(sha512_HMAC.doFinal(message.getBytes()));

    
    catch (Exception e)
        System.out.println("Error");
    
    System.out.println(hash);
    return hash;

它返回以下消息: "errorCode":"130","errorMessage":"V2 API Nonce 值必须为正整数","re​​sult":"error"

但是这个消息似乎是一个通用消息——当输入其他 nonce 值时,它也返回相同的消息

【问题讨论】:

显示您遇到的错误。 不要描述消息。显示任何消息的确切文本,让您相信它不起作用!。即使您认为它没有帮助,请记住,您不知道如何解决问题,因此您可能不是判断哪些信息有用的最佳人选。 你的 JS 代码甚至不是 JS。是蟒蛇 尝试颠倒参数的顺序(针对您的请求),第一个应该是 http 请求方法,然后是 url。 sry 最初附加了一个 python 代码而不是 js。 JS在问题中更新了 【参考方案1】:

您的message(payload)hash(signature) 错误...

例子:

String payload = Base64.encodeBase64String(message.getBytes("UTF-8"));
String signature = CreateToken(payload, key.toUpperCase());

---------
private static String CreateToken(String message, String secretKey)
String hash = "";
try     

    Mac sha512_HMAC = Mac.getInstance("HmacSHA512");
    SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA512");
    sha512_HMAC.init(secret_key);

// hash = Base64.encodeBase64String(sha512_HMAC.doFinal(message.getBytes()));
hash = Hex.encodeHexString(sha512_HMAC.doFinal(message.getBytes()));


catch (Exception e)
    System.out.println("Error");

System.out.println(hash);
return hash;

【讨论】:

以上是关于将 Python/JS 翻译成 Java - JSON & HMAC的主要内容,如果未能解决你的问题,请参考以下文章

将定点运算符翻译成 Haskell 语言

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)

将 mongodb 聚合查询翻译成 Java/Kotlin Spring Data

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)

java 将一个正整数翻译成人民币大写的读法

使用 CSVhelper 将单个列更新为先前编写的 CSV 文件。我有 Java 代码,但无法将其翻译成 C#