【问题标题】:Masking sensitive information in node屏蔽节点中的敏感信息
【发布时间】:2017-03-22 03:10:18
【问题描述】:

我只想屏蔽/隐藏 json 值而不是键。 例如:-

myObject = {"Name":"value1","Phoneno":"545454545445"}
Output should be like below:
myObject = {"key1":*****

***,"key2":*****}

你能告诉我,我们如何在 nodejs 中做到这一点? 谢谢。

【问题讨论】:

    标签: javascript json node.js typescript


    【解决方案1】:

    怎么样:

    let myObject = { "Name": "value1", "Phoneno": "545454545445" };
    let output = {};
    
    function mask(value: string) {
        let maskedValue = "";
        for (let i = 0; i < value.length; i++) {
            maskedValue += "*";
        }
    
        return maskedValue;
    }
    
    Object.keys(myObject).forEach(key => {
        output[key] = mask(myObject[key]);
    });
    
    console.log(output); // Object {Name: "******", Phoneno: "************"}
    

    (code in playground)

    【讨论】:

    • 谢谢,它正在工作。但是如果 JSON 如下所示呢?
    • 像下面这样?下面是什么?我不明白
    【解决方案2】:

    以下策略使用for...in 循环遍历对象,将所有属性值替换为星号链。

    const myObject = {"Name": "value1", "Phoneno": "545454545445"};
    
    const mask = obj => {
      const masked = {};
      for (let key in obj) masked[key] = "*****";
      return masked;
    };
    
    console.log("original:",    myObject );
    console.log("masked:", mask(myObject));

    如果您希望掩码值是星号,但长度与原始值相同(而不是恒定长度),请将 for...in 循环更改为以下内容:for (let key in obj) masked[key] = "*".repeat(obj[key].length);

    更新:屏蔽嵌套对象(甚至数组)

    在您的 cmets 中,您询问了嵌套对象中的屏蔽值。

    为了处理嵌套对象,甚至是任何嵌套排列的对象和/或数组的组合,您可能需要递归。简而言之,如果当前值是原始值(例如字符串、数字、布尔值等),则将其替换为虚拟字符串,但如果当前值是对象本身(或数组),则重新- 从一开始将该值发送回屏蔽过程。

    以下示例显示了一种可以完成此操作的方法。我使用 jQuery 来检测一个值是普通对象还是数组。在此示例中,对象属性名称以“A”、“B”、“C”等结尾。数组被转换为对象,例如["foo", "bar"] 将转换为 {"0": "*****", "1": "*****"}

    const myObject = {propA: "a", propB: {propBA: "ba", propBB: "bb"}, propC: ["c0", "c1"], propD: {propDA: "da", propDB: {propDBA: "dba", propDBB: "dbb"}, propDC: ["dc0", "dc1"]}, propE: ["e0", {propE1A: "e1a", propE1B: "e1b"}, ["e20", "e21"]]};
    
    const mask = objOrArr => {
      const masked = {};
      for (let key in objOrArr) {
        const val = objOrArr[key];
        if ($.isPlainObject(val) || $.isArray(val)) {
          masked[key] = mask(val);
        } else {
          masked[key] = "*****";
        }
      }
      return masked;
    };
    
    console.log("original... ",    myObject );
    console.log("masked... ", mask(myObject));
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 我不确定使用恰好具有对象值长度的占位符是否是个好主意。在我看来,使用静态占位符会更好。既然它被屏蔽了,那么无论如何该值有多长都没关系。
    • @Vernon,很公平。将代码更改为for (let key in obj) masked[key] = "*****";。使它更加简单。 ...将您的建议纳入我的回答中。
    • 谢谢大家,但如果 obect 如下所示:let myObject ={ Header: { ID: "1234", Name: "XYZ", Username: "abc", domain: "R",来源:“abc”,MessageVersion:“1.0”,SendDateTime:日期},客户:{事件:“1234”}};
    • 您可能需要递归。查看我的答案的更新。
    • 此解决方案有效,但这里的问题是 - 它会破坏原始 JSON 结构。原始的 JSON 结构有嵌套的数组和对象,而解析的结构是扁平的,只有键值对
    【解决方案3】:

    也许你会发现库 https://github.com/tcdl/json-masker 很有用,它允许你这样做:

    const mask = require('json-masker');
    const myObject = {"Name": "value1", "Phoneno": "545454545445"};
    const masked = mask(myObject); // will produce: 
                                   // {"Name": "xxxxx*", "Phoneno": "************"}
    

    【讨论】:

      【解决方案4】:

      使用 maskdata npm 模块:https://www.npmjs.com/package/maskdata

      它提供的功能,

      1. 屏蔽电话号码
      2. 屏蔽密码
      3. 屏蔽电子邮件
      4. 屏蔽 JSON 字段
      5. 屏蔽卡号
      6. 屏蔽字符串中的值

      在您的情况下,您想要屏蔽 JSON 字段。使用,

      
      const maskJSONOptions = {
        // Character to mask the data. Default value is '*'
        maskWith : "*",
        // Field names to mask. Can give multiple fields.
        fields : ['password', 'firstName'] // It should be an array
      };
      
      const obj = {
        password : "IKnowNothing",
        firstName : "Jon",
        lastName : "Snoww"
      };
      const maskedObj = MaskData.maskJSONFields(obj, maskJSONOptions);
      
      //Output : { password: '************', firstName: '***', lastName: 'Snoww' }
      

      我也遇到了屏蔽数据的问题。所以我发布了这个 npm 模块。

      您还可以使用 maskdata 模块屏蔽嵌套对象。

      例如:

      const MaskData = require('./maskdata');
      
      const maskJSONOptions = {
       // Character to mask the data. Default value is '*'
       maskWith : "*",
      
       // It should be an array
       // Field names to mask. Can give multiple fields.
       fields : ['level1.level2.level3.field3', 'level1.level2.field2', 'level1.field1', 'value1'] 
      };
      
      const nestedObject = {
       level1: {
         field1: "field1",
         level2: {
           field2: "field2",
           level3: {
             field3: "field3",
           }
         }
       },
       value1: "value"
      };
      const maskedObj = MaskData.maskJSONFields(nestedObject, defaultJSONMaskOptions2);
      
      //Output : {"level1":{"field1":"******","level2":{"field2":"******","level3":{"field3":"******"}}},"value1":"*****"}
      
      

      【讨论】:

      • 它不适用于像 ARRAY[*].FIELD1.FIELD2 这样的嵌套字段有什么解决方案吗?
      猜你喜欢
      • 2019-12-19
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多