如何引用汇编"验证"来电程序集"?的签名/真实性

时间:2013-02-05 05:26:50

标签: .net security .net-assembly digital-signature authenticode

我的问题是关于在.NET程序集之间强制执行安全性。这是场景:

  • 基础程序集部署在服务器上。
  • 应用程序中附带了一系列插件程序集。
  • 插件使用基础中的功能。
  • 由于基金会提供敏感的操作和数据,因此必须确保插件(来电者程序集)是真实的,并且来自某个发布商。

我对安全性很陌生,并且对Strong-Naming和Digital Signatures有基本的把握。所以,如果你能够详细解释完成上述目标的可能方法,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

修改

抱歉,再次阅读您的问题时,我知道您无法控制插件。

您希望根据调用它的程序集来限制基础程序集的使用。

不幸的是,除了检查敏感部件中的调用组件之外没有其他方法可以做到这一点。如果您避免使用公共静态成员,则可以在构造函数中进行检查。

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; }
    }
}