كيف يمكنني الحفاظ على إلغاء التسلسل التوافق عبر غموض و يبني التصحيح?

StackOverflow https://stackoverflow.com/questions/514332

سؤال

أنا أحاول الحصول على {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. لا تعتم تلك الأنواع.هذا سيجعل الأمور فقط العمل.
  2. الكتابة الخاصة بك مسلسل التعليمات البرمجية.

حيث يمكنك الحصول على أي شيء من التعتيم ، كنت أذهب مع #1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top