كيف يمكنني الحفاظ على إلغاء التسلسل التوافق عبر غموض و يبني التصحيح?
-
21-08-2019 - |
سؤال
أنا أحاول الحصول على {smartassembly} .NET obfuscator للعمل مع نظام بلدي.أنا حاليا تخزين بيانات المستخدم في سلسلة من تسلسل القاموس الطبقات ، ومن ثم إلغاء تسلسل تلك الطبقات للحصول على البيانات مرة أخرى.أنا بالفعل تجاهل إصدار التجميع المعلومات, فقط لأن طريقة صنع الحياة من الألم.هذا الرمز هو مقتبس من 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 بالنسبة لنا.أي طريقة للالتفاف على هذه المشكلة ؟ يجب أن لا يحجب بيانات الصفوف ؟ التي تبدو كبيرة ثغرة أمنية.
المحلول
ربما تنظر مسلسل تلك ليست مرتبطة نوع حقل الأسماء ؟ على سبيل المثال ، 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).
على النقيض من هذا أن العقد الآخر على أساس serializers (مثل XmlSerializer
أو DataContractSerializer
) - حيث أنك ستضطر إلى وضع الأعضاء اسم في الصفات ، التي من شأنها أن الكثير جدا تجعل التشويش لا طائل:
[DataContract]
public class a12 {
[DataMember(Name="Bar")]
public string a {get;set;}
}
نصائح أخرى
التشويش لا توفر الأمن في المقام الأول.لذا قد ترغب في النظر في إسقاطه ، الفترة.
اثنين من خيارات أرى هي:
- لا تعتم تلك الأنواع.هذا سيجعل الأمور فقط العمل.
- الكتابة الخاصة بك مسلسل التعليمات البرمجية.
حيث يمكنك الحصول على أي شيء من التعتيم ، كنت أذهب مع #1.