2013-02-05 46 views
3

我的问题是关于在.NET程序集之间执行安全性。而这里的情景:“引用程序集”如何验证“调用程序集”的签名/真实性?

  • 一个基金会组件部署在服务器上。
  • 一系列插件组件在应用程序中发货。
  • 插件使用功能从基金会
  • 由于基金会提供了敏感的操作和数据,它必须确保调用者程序集是可信的并且来自某个发布者。

我对安全性很陌生,对强命名和数字签名有基本的把握。所以,如果你可以请完整说明可能的方法来完成上述目标,我将不胜感激。

+0

工作的基础和插件驻留在同一台服务器上? –

+1

'Assembly.GetCallingAssembly()' – jgauffin

回答

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

你好@adrianm,谢谢。让我看看我是否正确理解这一点:代码中的SensitiveClass是我的Foundation,CallingAssembly是插件,对不对?如果我使用SensitiveClass已知的值检查CallingAssembly的公钥,那么我可以确定该插件是真实的? 2问题:1,黑客是否可以创建一个插件并给它同名+版本+公钥? 2.这意味着我的SensitiveClass应该以某种方式知道(可能会在运行时下载)通过安全通道从可信服务器获取插件的预期公钥? –

+1

黑客需要使用您信任的供应商的私钥来创建具有正确公钥的程序集。 – adrianm

+1

关于你的第二个问题。公开密钥就是这样。您不需要密钥的加密通道,但必须保护通道免受中间​​人攻击。 – adrianm