我有几个类似的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结构一起使用.
任何帮助,将不胜感激.
以下是我认为我将采取的方法:
创建一个可以获取字符串值的辅助方法,并以日志所需的方式隐藏它.也许这样的事情,例如:
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)制作可以接受一个又一个辅助方法,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)最后,编译一个JSONPath表达式列表,以获取要在所有希望获得的JSON实体中隐藏的值.从上面的示例JSON中,我认为你会想要隐藏Password
它发生的任何地方以及number
它是否发生在里面credit_card
.表示为JSONPath,它们分别是$..Password
和$..credit_card.number
.(请记住,JSON.Net中的JSONPath表达式区分大小写.)获取此列表并将其放入某个配置设置中,以便在需要时可以轻松更改.
现在,只要你想注销一些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
归档时间: |
|
查看次数: |
2555 次 |
最近记录: |