使用私钥签名程序集

5

大家好,我有些困惑,希望有人能帮助我解决。我的问题如下:

  1. 每个人都说要使用私钥签名程序集,但没有人说如何获取私钥,也就是说,我可以使用sn.exe -K创建私钥/公钥对,但如何从中提取私钥来签名呢?

  2. 如果我用私钥签名程序集,然后将其发送给程序集的用户,那么他将直接将此程序集添加到全局程序集并使用它,那么是否需要向他发送公钥以便使用此程序集,或者公钥已经与程序集一起,因此任何人都可以使用此程序集,如果任何人都可以使用,加密的意义是什么呢?

4个回答

21

我有点困惑

这是一个让人感到困惑的话题。

如何从中提取私钥?

你不需要这样做。签名工具会使用密钥文件,并且在必要时会智能地提取私钥。

需要将公钥发送给他才能使用此程序集吗?

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

如果任何人都可以使用它,那么使用私钥加密有什么意义呢?

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

例如,微软的公钥令牌是众所周知的。这就是为什么它被称为“公共”密钥:因为公众知道它。当您看到带有Microsoft公钥的程序集时,那就是证据表明Microsoft制作了该程序集,因为“可以使用Microsoft的公钥解密签名的程序集必须是由拥有Microsoft私钥访问权限的人制作的”。该密钥深藏在Redmond的七号大楼内部受到严密保护,因此您有很好的证据表明确实有一位工作在Microsoft的人制作了该程序集。

这个系统的目的是让人们制定将证据转化为权限的策略。您的客户可以制定一个策略,即“如果我有证据表明此程序集由Ashish制作,则允许代码执行我被允许执行的任何操作”。

现在,你可能会合理地问道:“客户如何知道给定的公钥是你的公钥?”这就是“密钥管理”问题,而这是你的责任。如果有一个邪恶的双胞胎告诉你的客户他的公钥是你的公钥,那么你的客户可能会信任你的邪恶的双胞胎,认为他就是你。在这种情况下,你有责任教育你的客户,告诉他们有一个邪恶的双胞胎试图欺骗他们,并教他们如何区分良好 Ashish 的公钥和邪恶双胞胎的公钥。

你还需要确保你的私钥保持私密。如果你的邪恶双胞胎得知你的私钥,那么他们显然可以随心所欲地冒充你;记住,签名的程序集提供了证据,证明拥有私钥访问权限的人制作了程序集;如果超过一个人可以访问该密钥,则证据不能确定一个人。


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

  2. 个人而言,我通常不会将库添加到全局程序集缓存(GAC)中——我更喜欢将程序集与使用它的项目放在一起。但是,您不需要向他发送公钥。

    您没有使用私钥对文件进行加密——您是用私钥对文件进行签名。公钥嵌入在程序集中,基本上您是在说:“此程序集的生产者绝对拥有这个公私钥对,因为您可以验证它已使用与此公钥对应的私钥进行签名。”


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

  2. 不,程序集包括公钥。也许你把它和使用X.509证书进行代码签名混淆了。但实际上不是这样的。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接