【问题标题】:Decoding timestamp encoded in ASN.1 (javascript)解码以 ASN.1 编码的时间戳(javascript)
【发布时间】:2019-03-03 09:16:32
【问题描述】:

我正在尝试解码从我的 HTTP 发布请求中收到的时间戳,但这是一项非常复杂的任务,我什至对 ASN.1/RFC 3161 没有任何适当的了解,所以如果有人愿意的话帮帮我,我真的很兴奋!

代码:

import { Action } from 'kawax-js';
import base64 from 'base-64';
var Ber = require('asn1').Ber;

class Timestamp extends Action {

 static type = 'TIMESTAMP';

 call = async (data) => {
  const authEncoded = base64.encode(username+":"+password);
  const formBody = Object.keys(data).map(key => 
  encodeURIComponent(key) + '=' + 
  encodeURIComponent(data[key])).join('&');
  const response = await 
  fetch("https://sign.test.cryptolog.com/tsa/post/", {
   method: 'POST',
   headers: {
    'Accept': 'application/x-www-form-urlencoded',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'Basic ' + authEncoded,
    'Access-Control-Allow-Origin': '*'
   },
   body: formBody
  });
  const bodyData = await response.arrayBuffer();
  var reader = new Ber.Reader(Buffer.from(bodyData));
  if (reader.peek() === Ber.Boolean)
  console.log("",reader.readBoolean());
  return bodyData;
 }
}

export default Timestamp;

我正在尝试使用 asn1 npm 包(https://www.npmjs.com/package/asn1)。

这是我运行代码时得到的响应:

如果我将await response.arrayBuffer() 更改为await response.text(),我会得到:

我真的不知道如何解决这个问题,我尝试了很多不同的东西,但似乎没有任何效果,如果有人能指出我正确的方向,那就太好了!

【问题讨论】:

  • 从您的帖子看来,response.arrayBuffer() 的变体似乎正确解码了 ASN.1 数据的一部分(不幸的是,这不是很清楚,因为代码和日志在任何方面都不匹配)。为了能够解析 ASN.1 的其余部分,您需要知道数据编码时使用的模式。 ASN.1 模式将为您提供编码数据结构的描述,以便您知道那里有哪些字段以及您对哪些字段感兴趣。
  • @AndreiBozantan,从外观上看,使用的编码是 BER,这是规范的。这意味着数据是自描述的,不需要模式。像 obj-sys.com/products/asn1ve/index.php ASN1 查看器这样的东西应该能够读取数据并告诉你它的样子,它甚至会给你一个通过解码数据构建的模式文件!

标签: javascript reactjs decoding asn.1 rfc3161


【解决方案1】:

看起来 ASN.1 模式也可从 RFC 获得(我猜这并不奇怪)。它在附录 C 中给出(参见here)。

使用它和 ASN.1 编译器,您可以生成可以解码响应的源代码。有一些针对 C/C++ 的免费 ASN1 编译器,我不知道 JavaScript 编译器。如果您有勇气,可以尝试this one,它会为您提供 C/C++ 源代码,然后您可以将其编译为 Web 程序集,然后您可以从 JavaScript 调用该程序集。这感觉,嗯,很脏,但它可能会起作用。

从 npm 的那个包看起来有一些问题,从它的 github 页面来看(ASN.1 相当复杂)。它可能只是有点坏了。

要掌握它,您不妨试试ASN.1 Playground。给它架构,编译它,上传你得到的一些数据作为响应,解码它,看看它是否大致是你所期望的。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多