Come faccio a mantenere la compatibilità tra deserializzazione offuscato e build di debug?
-
21-08-2019 - |
Domanda
Sto cercando di ottenere il {} Smartassembly obfuscator NET per lavorare con il mio sistema. Io attualmente memorizzare i dati degli utenti in una serie di lezioni del dizionario serializzati, e quindi deserializzare le classi per ottenere i dati indietro. Sto già ignorando le informazioni sulla versione di montaggio, proprio perché in questo modo rendere la vita un dolore. Tale codice viene adattato da 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;
}
}
Il problema è che ora la mia app offuscato ignorerà le informazioni sulla versione, ma non è in grado di leggere i dati salvati dal l'applicazione non offuscato, e viceversa. Avremo bisogno di avere una versione non offuscato, al fine di eseguire il debug dell'applicazione, quindi questo è un abbastanza grande showstopper per noi. Un modo per aggirare questo problema? Non dovrei solo offuscare le classi di dati? Che sembra una abbastanza grande buco di sicurezza.
Soluzione
Forse considerare un serializzatore che non è legata al tipo e campo nomi? Ad esempio, protobuf-net è un serializzatore binario, ma utilizza tag numerici impostati (tramite un attributo) contro ogni membro. Ciò significa:
- la serializzazione non è legato alla versione di montaggio a tutti
- le informazioni sul nome campo non è nel file serializzato
- (dal sopra) non importa se il codice è offuscato
- (e) il file non può essere utilizzato per rompere banalmente l'offuscamento (anche se i dati potrebbero ancora suggerire intento a meno che non criptato)
Ad esempio:
[ProtoContract]
public class Foo {
[ProtoMember(1)]
public string Bar {get;set;}
}
Qui, il 1
è tutto ciò che ha identificato il membro nel file. La chiave qui è che è su base contrattuale, in modo da può essere deserializzato in seguito con un tipo non correlato:
[ProtoContract]
public class a12 {
[ProtoMember(1)]
public string a {get;set;}
}
(che va bene in quanto offuscamento conserva metadati, IIRC).
Contrasto questo per altri serializzatori contratto-based (come ad esempio XmlSerializer
o DataContractSerializer
) - in cui si sarebbe costretti a mettere il nome utente negli attributi, che sarebbe praticamente inutile rendere offuscamento:
[DataContract]
public class a12 {
[DataMember(Name="Bar")]
public string a {get;set;}
}
Altri suggerimenti
L'offuscamento non fornisce la sicurezza in primo luogo. Quindi, si può prendere in considerazione di farlo cadere, punto.
Le due opzioni che vedo sono:
- Non offuscare quei tipi. Questo renderà le cose solo di lavoro.
- scrivere il proprio codice serializzatore.
Dal momento che si guadagna nulla da offuscando, mi piacerebbe andare con # 1.