Como faço para manter a compatibilidade desserialização através ofuscado e compilações de depuração?

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

Pergunta

Eu estou tentando obter a {smartassembly} NET obfuscator para trabalhar com meu sistema. Eu atualmente armazenar os dados do usuário em uma série de classes de dicionário serializados, e, em seguida, desserializar dessas classes para obter a volta de dados. Eu já estou ignorando informações sobre a versão de montagem, só porque dessa forma a tornar a vida uma dor. Esse código é adaptado do 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;
    }
}

O problema é que agora meu aplicativo ofuscado irá ignorar informações versionamento, mas não pode ler dados gravados pelo aplicativo não ofuscado, e vice-versa. Vamos precisar de ter uma versão não ofuscada, a fim de depurar o aplicativo, de modo que este é um muito grande empecilho para nós. Qualquer maneira de contornar este problema? Devo apenas não ofuscar as classes de dados? Isso parece uma muito grande falha de segurança.

Foi útil?

Solução

consideram Talvez um serializador que não está vinculado ao tipo de campo e nomes? Por exemplo, protobuf-net é um serializador binário, mas usa numérico etiquetas set (via um atributo) contra cada um dos membros. Isso significa que:

  • serialização não está vinculado à versão de montagem em tudo
  • as informações de nome de campo não está no arquivo serializado
  • (pela acima) ele não importa se o código é ofuscado
  • (e) o arquivo não pode ser usado para trivialmente quebrar a ofuscação (embora os dados ainda podem sugerir intenção a não ser criptografada)

Por exemplo:

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

Aqui, o 1 é tudo o que identificou o membro no arquivo. A chave aqui é que ele é baseado em contrato, de modo que pode ser desserializado posteriormente com um tipo não relacionado:

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

(o que é bom desde ofuscação preserva metadados, IIRC).

Compare isso com outras serializers baseada em contrato (como XmlSerializer ou DataContractSerializer) - onde você iria ser forçado a colocar o nome de membro nos atributos, o que seria muito bonito tornar ofuscação inútil:

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

Outras dicas

Obfuscation não fornece a segurança em primeiro lugar. Assim, você pode querer considerar deixá-la cair, período.

As duas opções que eu vejo são:

  1. Não ofuscar esses tipos. Isso fará com que as coisas só trabalho.
  2. escrever seu próprio código serializer.

Uma vez que você não ganha nada por ofuscar, eu iria com # 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top