我正在尝试使用{smartassembly} .NET混淆器来使用我的系统。我目前将用户数据存储在一系列序列化的字典类中,然后反序列化这些类以获取数据。我已经忽略了汇编版本信息,只是因为这样会让生活变得痛苦。该代码为adapted from MSDN:
//to avoid cross-versioning problems
public sealed class CrossVersionDeserializationBinder : SerializationBinder {
public override Type BindToType(string assemblyName, string typeName) {
Type typeToDeserialize = null;
typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
typeName, assemblyName));
return typeToDeserialize;
}
}
问题是,现在我的混淆应用程序将忽略版本控制信息,但无法读取非混淆应用程序保存的数据,反之亦然。为了调试应用程序,我们需要一个非混淆的版本,所以这对我们来说是一个非常大的showstopper。有什么方法可以解决这个问题吗?我应该不混淆数据类吗?这似乎是一个非常大的安全漏洞。
答案 0 :(得分:7)
也许考虑一个与类型和字段名称无关的序列化程序?例如,protobuf-net是二进制序列化程序,但使用针对每个成员设置的数字标记(通过属性)。这意味着:
例如:
[ProtoContract]
public class Foo {
[ProtoMember(1)]
public string Bar {get;set;}
}
此处,1
是标识文件中成员的全部内容。这里的关键是它是基于契约的,因此可以在以后使用不相关的类型进行反序列化:
[ProtoContract]
public class a12 {
[ProtoMember(1)]
public string a {get;set;}
}
(由于混淆保留了元数据,IIRC,这很好。)
将此与其他基于合同的序列化程序(例如XmlSerializer
或DataContractSerializer
)进行对比 - 您将被迫将成员名称放在属性中,这几乎会使混淆变得毫无意义:
[DataContract]
public class a12 {
[DataMember(Name="Bar")]
public string a {get;set;}
}
答案 1 :(得分:-1)
混淆不首先提供安全性。所以,你可能想考虑放弃它,期间。
我看到的两个选项是:
由于你通过混淆得到任何东西,我会选择#1。