如何屏蔽 json 字符串中存在的密码?

Posted

技术标签:

【中文标题】如何屏蔽 json 字符串中存在的密码?【英文标题】:How to mask password exist in json string? 【发布时间】:2021-06-26 02:23:45 【问题描述】:

我正在为我的 API 响应开发 .net core c# 日志记录项目。 输出为 JSON 格式,响应包含敏感信息(例如密码)

当响应输出包含更复杂的带有数组的 Json 结构时,我被卡住了,其项目是复杂对象,每个对象都有一个“id”属性和表示敏感字段的关键字,显示为该“id”字段的值(请参阅下面的示例)。

对于以下输出,如果 "id" 的值包含单词 'password' ,我如何使用 RegEx 将密码值替换为 'XXXX' 。例如...下面有需要屏蔽的值...



    "type": "CatalogResourceRequest",
    "description": null,
    "reasons": null,
    "data": 
        "customProperties": [
            
                
                "data": 
                    "id": "CloneFrom",
                    "is_hidden": false,
                    "value": "TMPLABC"
                
            ,
            
                
                "data": 
                    "id": "Debug",
                    "is_hidden": false,
                    "value": false
                
            ,
            
                "data": 
                    "id": "abc_password",
                    "is_hidden": false,
                    "value": "This_Is_Password_To_Be_Masked"
            ,

                "data": 
                    "id": "password_of_user1",
                    "is_hidden": false,
                    "value": "This_Is_Password_To_Be_Masked_Also"
                                   
                           
    ]
    

【问题讨论】:

如果您使用 Serilog 记录到 JSON,您应该知道此功能已经存在:github.com/sandermvanvliet/Serilog.Enrichers.Sensitive asp.net core的版本是多少?你用的是哪个序列化器,Json.Net 还是 System.Text.Json? How to mask sensitive values in JSON for logging purposes 的可能重复项 - 假设您使用的是 Json.Net 【参考方案1】:

这是一个使用 Json.Net 的工作演示:

[HttpGet]
public IActionResult Index()

    var data = System.IO.File.ReadAllText("test.json");
    var json = ToObject(data);
     

    return Ok(json);

public object ToObject(string json)

    if (string.IsNullOrEmpty(json))
        return null;
    return ToObject(JToken.Parse(json));


public object ToObject(JToken token)

    switch (token.Type)
    
        case JTokenType.Object:
            return token.Children<JProperty>()
                        .ToDictionary(prop => prop.Name,
                                        prop => ToObject(prop.Value),
                                        StringComparer.OrdinalIgnoreCase);
        case JTokenType.Array:
            return token.Select(ToObject).ToList();
        case JTokenType.Null:
            return null;
        default:
            if(((JValue)token).Value.ToString().Contains("password"))
            
                ViewBag.Id = true;
                return ((JValue)token).Value;
            
            if(((JProperty)token.Parent).Name== "value" && ViewBag.Id!=null)
            
                if(ViewBag.Id)
                
                    ViewBag.Id = false;
                    return "XXXXX";
                
                return ((JValue)token).Value;
            
            return ((JValue)token).Value;
    

顺便说一句,您提供的 json 不正确,应该如下所示:


  "type": "CatalogResourceRequest",
  "description": null,
  "reasons": null,
  "data": 
    "customProperties": [
      

        "data": 
          "id": "CloneFrom",
          "is_hidden": false,
          "value": "TMPLABC"
        
      ,
      

        "data": 
          "id": "Debug",
          "is_hidden": false,
          "value": false
        
      ,
      
        "data": 
          "id": "abc_password",
          "is_hidden": false,
          "value": "This_Is_Password_To_Be_Masked"
        
      ,
      
        "data": 
          "id": "password_of_user1",
          "is_hidden": false,
          "value": "This_Is_Password_To_Be_Masked_Also"
        
      
    ]
  

【讨论】:

以上是关于如何屏蔽 json 字符串中存在的密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行Jenkins CI管道时屏蔽作为用户输入传递的密码?

如何知道Json字符串中是不是存在密钥[重复]

字符串中的 Java 掩码密码

在 Hive 视图中屏蔽子字符串

如何删除“在json字符串中?

C#中在文本框中输入的字符串怎么让它隐藏