我的问题是关于在.NET程序集之间执行安全性。而这里的情景:“引用程序集”如何验证“调用程序集”的签名/真实性?
- 一个基金会组件部署在服务器上。
- 一系列插件组件在应用程序中发货。
- 插件使用功能从基金会。
- 由于基金会提供了敏感的操作和数据,它必须确保调用者程序集是可信的并且来自某个发布者。
我对安全性很陌生,对强命名和数字签名有基本的把握。所以,如果你可以请完整说明可能的方法来完成上述目标,我将不胜感激。
我的问题是关于在.NET程序集之间执行安全性。而这里的情景:“引用程序集”如何验证“调用程序集”的签名/真实性?
我对安全性很陌生,对强命名和数字签名有基本的把握。所以,如果你可以请完整说明可能的方法来完成上述目标,我将不胜感激。
编辑
对不起,读你的问题,当我再次明白,你不控制插件。
您想根据组件调用它来限制基础组件的使用。
不幸的是,除了在敏感部分检查调用程序集外,没有其他方法可以做到这一点。如果您避免使用公共静态成员,您可以在构造函数中进行检查。
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; }
}
}
你好@adrianm,谢谢。让我看看我是否正确理解这一点:代码中的SensitiveClass是我的Foundation,CallingAssembly是插件,对不对?如果我使用SensitiveClass已知的值检查CallingAssembly的公钥,那么我可以确定该插件是真实的? 2问题:1,黑客是否可以创建一个插件并给它同名+版本+公钥? 2.这意味着我的SensitiveClass应该以某种方式知道(可能会在运行时下载)通过安全通道从可信服务器获取插件的预期公钥? –
黑客需要使用您信任的供应商的私钥来创建具有正确公钥的程序集。 – adrianm
关于你的第二个问题。公开密钥就是这样。您不需要密钥的加密通道,但必须保护通道免受中间人攻击。 – adrianm
工作的基础和插件驻留在同一台服务器上? –
'Assembly.GetCallingAssembly()' – jgauffin