【问题标题】:Unzipping encrypted compressed report from Amazon Selling Partner解压缩来自亚马逊销售合作伙伴的加密压缩报告
【发布时间】:2022-08-12 05:23:55
【问题描述】:

我正在使用getReport 操作来获取documentId,稍后我使用它来下载加密和压缩的报告文档本身。

代码如下所示:

const documentData = await this.sellingPartner.callAPI({
  operation: \"getReportDocument\",
  endpoint: \"reports\",
  path: { reportDocumentId: reportData.reportDocumentId }
})

const request = https.get(documentData.url, function(res) {
  const data = [];
  res.on(\"data\", chunk => data.push(chunk));
  res.on(\"end\", () => {
    const key = new Buffer.from(documentData.encryptionDetails.key, \'base64\')
    const initializationVector = new Buffer.from(documentData.encryptionDetails.initializationVector, \'base64\')

    const input = Buffer.concat(data)

    let result;
    try {
      result = aes.decryptText(
        aes.CIPHERS.AES_256,
        key,
        initializationVector,
        input
      )
    } catch (e) {
      console.log(e)
    }

    console.log(\">>>>\")
    console.log(result)

    zlib.gunzip(result, (err, unzipped) => {
      debugger
    });
  });
}

我得到的当前错误来自zlib:

Error: incorrect header check
    at Zlib.zlibOnError [as onerror] (node:zlib:189:17)

即使我将未加密的值直接传递给 zlib,我也会得到相同的结果。

文档中有一个Sample Java code example,但我不能很好地理解他们在哪里解密:解压缩之前还是之后?

无论如何,解决这个问题的正确方法是什么:解压缩和解密或解密和解压缩?前者根本不起作用,后者几乎起作用,但在解压缩部分失败。

如何解决解压问题?

    标签: javascript node.js encryption request selling-partner-api


    【解决方案1】:

    简短的回答: 如果指定了压缩类型,则先解密,然后再解压缩。

    更长的答案:

    经过一番研究,我偶然发现了这个例子(遗憾的是用 python 而不是 javascript 编写),但它涵盖了更详细的步骤。

    https://github.com/amzn/selling-partner-api-docs/issues/186#issuecomment-756108550

    它包含压缩或未压缩的情况。 特别是对于压缩它看起来像这样:

    import gzip
    import requests
    
    from cryptography.hazmat.primitives import padding
    from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
    
    def ase_cbc_decryptor(key, iv, encryption):
        cipher = Cipher(algorithms.AES(base64.b64decode(key)), modes.CBC(base64.b64decode(iv)))
        decryptor = cipher.decryptor()
        decrypted_text = decryptor.update(encryption)
        unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
        unpaded_text = unpadder.update(decrypted_text)
        return unpaded_text + unpadder.finalize()
    
    def get_report_document_content(self, key, iv, url, compression_type=None):
        resp = requests.get(url=url)
        resp_content = resp.content
    
        decrypted_content = ase_cbc_decryptor(key=key, iv=iv, encryption=resp_content)
    
        if compression_type == 'GZIP':
           decrypted_content = gzip.decompress(decrypted_content)
    
        code = 'utf-8'
        if 'cp1252' in resp.headers.get('Content-Type', '').lower():
            code = 'Cp1252'
        return decrypted_content.decode(code)
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2022-09-23
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多