3

私の質問は、.NET アセンブリ間のセキュリティの強化に関するものです。そして、ここにシナリオがあります:

  • Foundationアセンブリがサーバーに展開されます。
  • 一連のプラグインアセンブリがアプリケーションに同梱されています。
  • プラグインはFoundationの機能を使用します。
  • Foundationは機密性の高い操作とデータを提供するため、プラグイン(呼び出し元アセンブリ) が本物であり、特定の発行元からのものであることを確認する必要があります。

私はセキュリティにかなり慣れていないので、厳密な名前付けとデジタル署名の基本を理解しています。したがって、上記の目標を達成するための可能な方法を完全に説明していただければ幸いです。

4

1 に答える 1

3

編集

申し訳ありませんが、あなたの質問をもう一度読んだときに、あなたがプラグインを制御していないことを理解しています。

それを呼び出すアセンブリに基づいて、基盤アセンブリの使用を制限したい。

残念ながら、機密部分の呼び出しアセンブリをチェックする以外にそれを行う方法はありません。public static メンバーを避ける場合は、コンストラクターでチェックを行うことができます。

public class SensitiveClass {
    private readonly byte[] SupplierXKey = new[] {...};

    public SensitiveClass() {
        var key = Assembly.CallingAssembly().GetName().GetPublicKey();

        if (!key.SequenceEqual(SupplierXKey)) {
            throw new SecurityException();
        }
    }
}

このソリューションでは、サプライヤがコードも保護する必要があることに注意してください。上記のコードを拡張して、呼び出し元の呼び出し元などを確認する必要がある場合があります。


古い間違った答え

プラグインのロードに MEF を使用していますか?

次に、特定のキーで署名されたアセンブリのみを許可する独自のカタログを作成できます。

何かのようなもの:

public class OnlyAssembliesFromX : ComposablePartCatalog
{
    private readonly byte[] SupplierXKey = new[] {...};

    AggregateCatalog _catalog = new AggregateCatalog();

    public OnlyAssemblisFromX(string path) {
        foreach (var file in Directory.GetFiles(path)) {
            var key = AssemblyName.GetAssemblyName(file)
                                  .GetPublicKey();

            if (key.SequenceEqual(SupplierXKey)) {
                _catalog.Catalogs.Add(new AssemblyCatalog(file));
            }
        }
    }

    public override IQueryable<ComposablePartDefinition> Parts {
        get { return _aggregateCatalog.Parts; }
    }
}
于 2013-02-05T07:24:52.200 に答える