使用私钥对程序集进行签名

时间:2010-12-26 16:19:45

标签: c# encryption

亲爱的,我有一些困惑,如果有人请你帮我解决这个问题。我的问题是:

  1. 每个人都说使用私钥对程序集进行签名,但是没有人说如何通过使用sn.exe获取私钥意味着-KI可以创建私钥/公钥对,但如何从中提取私钥以对其进行签名

  2. 如果我用私钥签署我的程序集,然后将其发送给该程序集的用户,那么他将直接将此程序集添加到全局程序集和使用中,因此需要向他发送公钥以使用此程序集或公钥是使用assemblyl所以任何人都可以使用这个程序集,如果任何人都可以使用加密的含义,它将是私钥。

4 个答案:

答案 0 :(得分:21)

  

我有些困惑

这是一个令人困惑的话题。

  

如何从中提取私钥?

你不需要。签名工具获取密钥文件。如果需要,它足够聪明地提取私钥。

  

是否需要向他发送公钥以使用此程序集?

公钥嵌入在程序集中。如果查看程序集的强名称,可以看到它。但是, 必须以某种方式与客户沟通正确的公钥是什么,如果您认为有人可能试图冒充您!有关详细信息,请参阅下一位。

  

如果有人可以使用私钥加密它的意义吗?

使用私钥对程序集进行签名的目的是生成证据证据表示“此程序集是由拥有与此公钥关联的私钥的人生成的。”

例如,Microsoft的公钥令牌是众所周知的。这就是为什么它被称为“公共”密钥:因为它被公众所知。当您看到具有Microsoft公钥的程序集,即Microsoft生成该程序集的证据,因为其签名可以使用Microsoft的公钥解密的程序集必须由具有访问权限的人生成到Microsoft的私钥。这个密钥在雷德蒙德的第七大楼深处严密保护,所以你有充分的证据表明真正在微软工作的人产生了这个组件。

此系统的目的是使人们能够设置策略,将证据转换为权限。您的客户可以制定一项政策,说明“如果我有证据表明此程序集是由Ashish生成的,那么请允许代码执行我允许执行的任何操作”。

现在,您可以合理地询问“客户如何知道给定的公钥是您的公钥?”这就是“关键管理”问题,那就是你的责任。如果你有一个邪恶的双胞胎谁告诉你的客户他的公钥是你的公钥,那么你的客户可能会相信你的邪恶双胞胎,认为他是你。在这种情况下,你的责任教育你的客户,那里有一个邪恶的双胞胎试图欺骗他们,并告诉他们如何分辨善良的Ashish的公钥之间的区别和邪恶双胞胎的公钥。

您还需要确保您的私钥保密。如果你的邪恶双胞胎知道你的私钥,那么显然他们可以随心所欲地冒充你;请记住,签名的程序集提供了证据,证明有权访问私钥的人生成了程序集;如果不止一个人可以访问该密钥,则证据不能识别一个人。

答案 1 :(得分:6)

  1. 您不提取私钥来签署程序集。您只需使用包含私钥和公钥的SNK文件(由sn -k生成)配置要签名的项目。您可以在程序集属性中指定它,但是现在首选方法是在项目选项中指定它(相信csc.exe上的/keyfile标志,我相信)。

  2. 我个人通常不会向GAC添加库 - 我更喜欢将程序集与正在使用它的项目一起保存。但不,你不需要向他发送公钥。

    您不是使用私钥加密文件 - 您使用该密钥签名。公钥嵌入在程序集中,基本上你会说,“这个程序集的生产者肯定拥有这个公钥/私钥对,因为你可以验证它是否已使用与此公钥对应的私钥进行签名。”

答案 2 :(得分:1)

  1. 您可以使用sn.exe创建密钥,它将创建一个.snk文件。您还可以使用sn.exe和相同的.snk文件对程序集进行签名,无需提取任何内容。在Visual Studio中完成所有操作也非常方便(项目属性,也可以生成和签名)。

  2. 不,程序集包含公钥。也许你把它与使用X.509证书的代码签名混淆了。不是那样的。

答案 3 :(得分:0)

我认为这两篇文章告诉你所有你需要知道的事情:

How to: Create a Public/Private Key Pair

How to: Sign an Assembly with a Strong Name