如何在JSON中屏蔽敏感值以进行日志记录

Nic*_*obs 5 json json.net

我有几个类似的JSON结构,我想写入SQL表进行日志记录.但是,JSON中的某些字段包含敏感信息,我想部分屏蔽这些信息,因此在日志中看不到完整值.

以下是其中一个JSON结构的示例:

{
  "Vault": 1,
  "Transaction": {
    "gateway": {
      "Login": "Nick",
      "Password": "Password"
    },
    "credit_card": {
      "number": "4111111111111"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我正在尝试更改4111信用卡号,以便它显示4xxx1111在JSON中.我正在使用Newtonsoft并将JSON反序列化为a JObject,但我仍然坚持如何掩盖该值.我认为线索是有道理的JToken,但尚未弄明白.我想使解决方案尽可能通用,以便它可以与我可能需要注销的任何JSON结构一起使用.

任何帮助,将不胜感激.

Bri*_*ers 5

以下是我认为我将采取的方法:

  1. 创建一个可以获取字符串值的辅助方法,并以日志所需的方式隐藏它.也许这样的事情,例如:

    public static string Obscure(string s)
    {
        if (string.IsNullOrEmpty(s)) return s;
        int len = s.Length;
        int leftLen = len > 4 ? 1 : 0;
        int rightLen = len > 6 ? Math.Min((len - 6) / 2, 4) : 0;
        return s.Substring(0, leftLen) +
               new string('*', len - leftLen - rightLen) +
               s.Substring(len - rightLen);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 制作可以接受一个又一个辅助方法,JToken和一个列表JSONPath表达式.在此方法中,使用匹配每个路径与令牌的内容SelectTokens.对于找到的每个匹配项,使用第一个帮助程序方法将敏感值替换为模糊版本.

    public static void ObscureMatchingValues(JToken token, IEnumerable<string> jsonPaths)
    {
        foreach (string path in jsonPaths)
        {
            foreach (JToken match in token.SelectTokens(path))
            {
                match.Replace(new JValue(Obscure(match.ToString())));
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,编译一个JSONPath表达式列表,以获取要在所有希望获得的JSON实体中隐藏的值.从上面的示例JSON中,我认为你会想要隐藏Password它发生的任何地方以及number它是否发生在里面credit_card.表示为JSONPath,它们分别是$..Password$..credit_card.number.(请记住,JSON.Net中的JSONPath表达式区分大小写.)获取此列表并将其放入某个配置设置中,以便在需要时可以轻松更改.

  4. 现在,只要你想注销一些JSON,就这样做:

    JToken token = JToken.Parse(json);
    string[] jsonPaths = YourConfigSettings.GetJsonPathsToObscure();
    ObscureMatchingValues(token, jsonPaths);
    YourLogger.Log(token.ToString(Formatting.None));
    
    Run Code Online (Sandbox Code Playgroud)

演示小提琴:https://dotnetfiddle.net/dGPyJF