【问题标题】:How do I encrypt only selected values of a JSON payload using a public key in NodeJS?如何使用 NodeJS 中的公钥仅加密 JSON 有效负载的选定值?
【发布时间】:2020-03-26 19:47:49
【问题描述】:

样本负载:

"object": {
    "a": "bau bau",
    "c": "boo boo",
    "e": "mrau mrau"
  },

加密的有效载荷:

"object": {
    "a": "kjdfhsijry874rhevfbwe",
    "c": "boo boo",
    "e": "vcsafsdkhdlksfhj23273"
  },

我创建了以下脚本,但即使我正在传递字符串,也会出现错误。 错误: TypeError:第一个参数必须是字符串、缓冲区、ArrayBuffer、数组或类似数组的对象。

    const crypto = require('crypto');
    const path = require('path');
    const fs = require('fs');

    const payload = require('./payload.json');
    console.log("original:", payload);

    const encrypted = encryptedJSON(payload, './public.pem', ["a", "e"]);
    console.log("encrypted:", encrypted);

    function encryptedJSON(obj, key, propertiesToEncrypt) {
        let result = { ...obj }; // Clone the object.
        const publicKey = fs.readFileSync(path.resolve(key), "utf8");
        for(let property of propertiesToEncrypt) {
            result[property] = crypto.publicEncrypt({ key: publicKey }, Buffer.from(obj[property], "utf8")).toString("base64");
        }
        return result;
}

【问题讨论】:

  • 而且,如果您在该行之前console.log(obj)?从您的问题中不清楚这些变量中的实际内容。你说"object": {} 暗示有一个外部对象,其中有一个名为object 的键,这肯定会破坏事情。
  • 您的代码看起来是正确的 - 我在本地复制并运行它并且它有效。我在 MacOS 上使用节点 v12.14.0。

标签: javascript node.js public-key-encryption


【解决方案1】:

您的代码对于这种payload.json 格式是正确的:

{
  "a": "bau bau",
  "c": "boo boo",
  "e": "mrau mrau"
}

但是这个会失败:

{
  "object": {
    "a": "bau bau",
    "c": "boo boo",
    "e": "mrau mrau"
  }
}

因为它试图加密不存在的顶级属性“a”(唯一的属性是“object”)。 如果您的有效负载遵循后一种格式,您可以像这样调整您的代码:

const encrypted = encryptedJSON(payload.object, './public.pem', ["a", "e"]);

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 2023-01-02
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2018-01-03
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多