【问题标题】:How can a "referenced assembly" verify the signature/authenticity of the "caller assembly"?“引用程序集”如何验证“调用程序程序集”的签名/真实性?
【发布时间】:2013-02-05 05:26:49
【问题描述】:

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

  • Foundation 程序集部署在服务器上。
  • 一系列插件程序集在一个应用程序中提供。
  • 插件使用Foundation的功能。
  • 由于 Foundation 提供敏感操作和数据,它必须确保 Plugin(调用者程序集)是真实的并且来自某个发布者。

我对安全性很陌生,对强命名和数字签名有基本的了解。因此,如果您能详细解释实现上述目标的可能方法,我将不胜感激。

【问题讨论】:

  • 基础和插件是否驻留在同一台服务器上?
  • Assembly.GetCallingAssembly()

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


【解决方案1】:

编辑

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

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

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

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 :) 您的 cmets 非常有帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多