Frage

Ich versuche, die {} Smartassembly .NET obfuscator zu bekommen mit meinem System zu arbeiten. Ich zur Zeit Speichern von Benutzerdaten in einer Reihe von serialisierten Wörterbuch Klassen, und dann diese Klassen deserialisieren zurück, um die Daten zu erhalten. Ich ignoriere bereits Montageversionsinformationen, nur weil auf diese Weise einen Schmerz, das Leben. Dieser Code wird von MSDN angepasst:

//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;
    }
}

Das Problem ist, jetzt meine verschleierten App Versionsinformationen ignoriert, kann aber nicht durch die nicht-verschleierte app, und vice versa gespeicherten Daten lesen. Wir werden eine nicht-verschleierte Version zu haben, um brauchen, um die Anwendung zu debuggen, so ist dies ein ziemlich großer Hemmschuh für uns. Jede Art und Weise, um dieses Problem zu bekommen? Sollte ich verschleiern einfach nicht die Datenklassen? Das scheint wie ein ziemlich großes Sicherheitsloch.

War es hilfreich?

Lösung

Vielleicht einen Serializer betrachten, die nicht auf die Art und Feldnamen gebunden ist? Zum Beispiel protobuf-net ist ein binäres Serializer, verwendet aber numerische Tags gesetzt (über ein Attribut) gegen jedes Mitglied. Das bedeutet:

  • wird die Serialisierung nicht an allen
  • zur Montageversion gebunden
  • die Feldname Informationen nicht in der serialisierten Datei
  • (von oben) wird es keine Rolle, ob der Code verschleiert ist
  • (und) die Datei nicht verwendet werden kann, um trivialer die Verschleierung zu brechen (obwohl die Daten noch Absicht vermuten lassen könnte, es sei denn verschlüsselt)

Zum Beispiel:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public string Bar {get;set;}
}

Hier sind die 1 alle, die das Mitglied in der Datei identifiziert. Der Schlüssel hier ist, dass es vertragsbasierte, so kann später mit einem nicht verwandten Typ deserialisiert werden:

[ProtoContract]
public class a12 {
    [ProtoMember(1)]
    public string a {get;set;}
}

(was in Ordnung ist, da Verschleierungs Metadaten bewahrt, IIRC).

Kontrast dies auf andere vertragsbasierte Serializer (wie XmlSerializer oder DataContractSerializer) - wo man gezwungen wäre, um den Mitgliedsnamen in den Attributen zu setzen, die so ziemlich Verschleierungs sinnlos machen würde:

[DataContract]
public class a12 {
    [DataMember(Name="Bar")]
    public string a {get;set;}
}

Andere Tipps

Obfuscation bietet keine Sicherheit an erster Stelle. Also, Sie können es in Erwägung ziehen, fallen, period.

Die beiden Optionen ich sehe, sind:

  1. Sie diese Typen nicht verschleiern. Das macht die Dinge einfach funktionieren.
  2. Schreiben Sie Ihren eigenen Serializer-Code.

Da du nichts gewinnen durch das Verschleiern, würde ich gehen mit Nummer 1.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top