使用.snk的私钥来签署任意数据

时间:2010-10-01 11:22:28

标签: .net strongname private-key

我正在开发一个.NET package manager,让我思考的一件事就是安全性。

鉴于任何人都可能将程序集上传到存储库,如何验证所述程序集是否来自可靠来源?例如,如果用NHForge的私人密钥签名,我会更加信任NHibernate.dll。为了确保这一点,我所要做的就是用NHForges的公钥验证装配签名。

现在,考虑到这一点,如何建立这种关系(这个特定的公钥属于这个特定的人)?我想出的一个想法如下:

  • 项目作者创建一个XML文件,其中包含有关项目和作者(姓名,电子邮件等)的信息
  • 此XML文件使用从.snk文件中提取的作者私钥进行签名,该文件稍后用于对程序集本身进行签名
  • 作者将此签名的XML文件上传到存储库,在该存储库中检查它并建立作者与公钥之间的关系

要实现这个(这是一个可行的想法,BTW?),我需要一种以编程方式访问.snk文件并阅读PK。在.NET中有什么东西吗?

1 个答案:

答案 0 :(得分:1)

首先,强名称应用作安全机制 - 它们仅用作程序集标识机制。对于这样的事情,我会研究Authenticode,它专门用于验证程序集的发布者/来源(即安全性而不仅仅是身份)。

话虽如此,您概述的想法并不可行,因为您无法使用强名称签署XML文件 - 强名称签名仅适用于.NET程序集。从理论上讲,您可以做的是为每个公钥维护某种特定发布者的某种映射(可能通过发布者注册过程或其他什么?),然后在将程序集的强名称签名添加到存储库之前验证它们。

至于技术方面,您可以通过StrongNameGetPublicKey函数(属于非托管强命名API的一部分)从.snk文件中提取公钥。但是,您必须自己将.snk文件加载到内存中。