5

{smartassembly} .NET 難読化ツールを自分のシステムで動作させようとしています。現在、一連のシリアル化された辞書クラスにユーザー データを格納し、それらのクラスを逆シリアル化してデータを取得しています。私はすでにアセンブリのバージョン情報を無視しています。その方法が面倒だからです。そのコードは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;
    }
}

問題は、難読化されたアプリがバージョン管理情報を無視するようになりましたが、難読化されていないアプリによって保存されたデータを読み取ることができず、その逆も同様です。アプリケーションをデバッグするには、難読化されていないバージョンが必要になるため、これは私たちにとって非常に大きな問題です。この問題を回避する方法はありますか? データクラスを難読化するべきではありませんか? これはかなり大きなセキュリティ ホールのようです。

4

2 に答える 2

7

おそらく、タイプとフィールド名に関連付けられていないシリアライザーを検討してください。たとえば、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 が保持されるため、これは問題ありません)。

これを他のコントラクトベースのシリアライザー (やなどXmlSerializer)DataContractSerializerと比較してください。属性にメンバー名を入れる必要があり、難読化がほとんど無意味になります。

[DataContract]
public class a12 {
    [DataMember(Name="Bar")]
    public string a {get;set;}
}
于 2009-02-05T06:32:07.540 に答える
-1

難読化はそもそもセキュリティを提供しません。したがって、それを削除することを検討することをお勧めします。

私が見る2つのオプションは次のとおりです。

  1. これらの型を難読化しないでください。これにより、物事がうまく機能します。
  2. 独自のシリアライザー コードを記述します。

難読化しても何も得られないので、#1 を使用します。

于 2009-02-05T02:47:18.353 に答える