首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON.net混淆

JSON.net混淆
EN

Stack Overflow用户
提问于 2015-01-16 06:29:04
回答 2查看 2.8K关注 0票数 3

我使用Json.Net对类进行序列化和非序列化。当我试图混淆程序集中的类时,我将无法正确地取消JSON字符串的序列化。我尝试过使用JsonProperty属性,但它仍然不能正确地取消序列化。

有谁知道如何绕开这件事,而不是让全班都不沉迷于此呢?

提前谢谢。

更新:

我为JSON对象创建了一个简单的类,如下所示:

代码语言:javascript
复制
public class JsonTestClass
{
    [JsonProperty("JsonID")]
    public int Id { get; set; }

    [JsonProperty("JsonName")]
    public string Name { get; set; }

    [JsonProperty("JsonYesNo")]
    public bool YesNo { get; set; }
}

JsonTestClass对象序列化为Json字符串的代码是:

代码语言:javascript
复制
 //Serialize
 var jsonObj = new JsonTestClass()
 {
     Id = 1,
     Name = "John",
     YesNo = true,
 };

 var JsonStr = JsonConvert.SerializeObject(jsonObj);
 Trace.WriteLine(">>" + JsonStr);

并将Json字符串反序列化为JsonTestClass,如下所示:

代码语言:javascript
复制
//Unserialize
var JsonStr = "{\"JsonID\":1,\"JsonName\":\"John Abc\",\"JsonYesNo\":true}";
Trace.WriteLine("<<" + JsonStr);

var jsonObj = JsonConvert.DeserializeObject<JsonTestClass>(JsonStr);
if (jsonObj == null)
{
    Trace.WriteLine("-- JsonObj is null");
}
else
{
    Trace.WriteLine(string.Format("-- Id={0} Name={1} YesNo={2}", jsonObj.Id, jsonObj.Name, jsonObj.YesNo));
}

所有操作都很好,没有模糊,用于序列化的调试输出是:

代码语言:javascript
复制
[64200] >>{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true} 

反序列化的调试输出是:

代码语言:javascript
复制
[64200] <<{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true} 
[64200] -- Id=1 Name=John Abc YesNo=True 

在程序集被模糊化(使用SmartAssembly来模糊这个程序集)和使用dotPeek查看模糊程序集之后,唯一一个有点类似于SmartAssembly的程序集是:

代码语言:javascript
复制
namespace
{
   internal class
   {
   }
}

用于序列化的调试输出是:

代码语言:javascript
复制
[65956] >>{} 

反序列化的调试输出是:

代码语言:javascript
复制
[65956] <<{"JsonID":1,"JsonName":"John Abc","JsonYesNo":true} 
[65956] -- Id=0 Name= YesNo=False 

希望这能帮你理清问题。

EN

回答 2

Stack Overflow用户

发布于 2018-10-16 11:22:37

如果您使用的是Visual 15和Visual 17附带的以Community形式提供的Dotfuscator,则必须从重命名时排除序列化对象的属性名称。您可以在Dotfuscator重命名选项卡中这样做。

之后,您可以像普通一样序列化和反序列化。

您可以在Preemtive解决方案网站的支持角找到详细的描述这里

票数 1
EN

Stack Overflow用户

发布于 2022-11-03 00:59:39

有几个选项,取决于您对可维护性、安全性等的偏好。

从混淆中排除属性

如果您只关心被混淆的类型名称,而不是属性名称,那么您可以用混淆属性来修饰每个要序列化的属性。(下面是Dotfuscator对此属性的支持的链接。)基本上,通过将属性从重命名中排除,这将允许Json.NET轻松地标识要设置的属性。

代码语言:javascript
复制
[Obfuscation(Exclude=true, Feature="renaming")]
public int MyProperty { get; set; }
  • 优点:简单明了
  • 缺点:如果你不混淆你的财产名称,你就会失去一些安全性。

公开用于反序列化的私有备份字段。

另一种让Json.NET反序列化模糊类的方法是使用JsonProperty属性将反序列化的目标从公共属性更改为私有字段。

代码语言:javascript
复制
[JsonProperty("a")]
private int _myField;

[JsonIgnore]
public int MyProperty
{
   get => _myField;
   set => _myField = value;
}

注意:如果在"MyProperty"属性中使用nameof(MyProperty)nameof(MyProperty),那么根据混淆设置的不同,很有可能将其作为"MyProperty"编译到.dll中,从而降低了最初试图通过混淆实现的总体安全性。

注2:当使用MVVM设计模式时,此解决方案很可能无法工作。在使用此模式时,常见的编码实践是利用属性设置器引发INotifyPropertyChanged事件。但是,使用JsonPropertyJsonIgnore属性将导致Json.NET使用反射而不是via属性设置私有字段的值。因此,将不会引发更改事件,从而使这在此特定场景中成为一个糟糕的解决方案。

  • 优点:你可以完全混淆你的财产名称。
  • 缺点:您需要为要参与序列化/反序列化的每个模糊属性创建备份字段。此外,在与MVVM模式一起使用时,可能会破坏INotifyPropertyChanged功能,这取决于您的实现细节。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27978422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档