Question

Je suis en train d'obtenir le {} Smartassembly obfuscateur .NET pour travailler avec mon système. Je données utilisateur actuellement des magasins dans une série de classes de dictionnaire sérialisés, puis deserialize ces classes pour récupérer les données. Je suis déjà en ignorant les informations de version de montage, juste parce que cette façon de rendre la vie une douleur. Ce code est adapté de 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;
    }
}

Le problème est, maintenant mon application Obfuscated ignorera versioning informations, mais ne peut pas lire les données enregistrées par l'application non-obfuscation, et vice versa. Nous aurons besoin d'avoir une version non-obfuscation pour déboguer l'application, donc c'est un assez grand Showstopper pour nous. De toute façon de contourner ce problème? Dois-je tout simplement pas les classes de obfusquer données? Cela semble être un joli grand trou de sécurité.

Était-ce utile?

La solution

Peut-être envisager un sérialiseur qui n'est pas liée au type et des noms sur le terrain? Par exemple, protobuf-net est un sérialiseur binaire, mais utilise des balises numériques définies (via un attribut) contre chaque élément. Cela signifie:

  • sérialisation est pas lié à la version de montage du tout
  • les informations de nom de domaine ne sont pas dans le fichier sérialisé
  • (par le haut), il ne sera pas question de savoir si le code est obscurcie
  • (et) le fichier ne peut pas être utilisé pour briser trivialement l'obscurcissement (bien que les données pourraient encore suggérer l'intention moins crypté)

Par exemple:

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

Ici, l'est tout ce qui 1 a identifié le membre dans le fichier. La clé ici est qu'il est basé sur un contrat, peut donc être désérialisée plus tard avec un type sans rapport avec:

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

(ce qui est bien depuis l'obscurcissement conserve les métadonnées, IIRC).

Contraste cela à d'autres serializers contractuels (tels que ou XmlSerializer DataContractSerializer) - où vous seriez obligé de mettre le membre nom dans les attributs, ce qui rendrait à peu près inutile d'obscurcissement:

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

Autres conseils

obscurcissement ne fournit pas la sécurité en premier lieu. Donc, vous voudrez peut-être envisager de le laisser tomber, période.

Les deux options que je vois sont:

  1. Ne pas obscurcir ces types. Cela rendra les choses fonctionnent.
  2. Écrivez votre propre code sérialiseur.

Puisque vous ne gagnez rien en obscurcissant, je partirais avec # 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top