文件签名:如何确保未修改Windows DLL?

时间:2009-03-07 17:05:34

标签: file signature verify

如果Windows DLL由Microsoft签名,我曾问过here个问题。我意识到他们是,并且一位好朋友告诉我,SigCheck实用程序可以提供有关文件签名的信息;但问题仍然存在:

虽然SigCheck告诉我文件是否已签名,但我需要确保Microsoft已对该文件进行了签名,之后没有其他人对其进行更改。我的意思是,如果有人篡改文件,然后再次签名文件(当然,签名上带有Microsoft的名称)该怎么办?

我怎样才能绝对确定该文件是真的?

3 个答案:

答案 0 :(得分:4)

  

“我的意思是,如果有人篡改了该怎么办?   文件,然后再次签名文件   (以微软的名字命名   签名,当然)?“

由于数字签名的性质,这是不可能的。为了生成数字签名,Microsoft对该文件进行了散列,然后使用其私钥(仅为他们知道)加密该散列。据我了解,其他供应商将使用other Certificate Authorities中的私钥,默认情况下Windows配置为信任。

当Windows检查文件时,它使用相应的公钥解密签名。然后将该签名与当前签名进行比较。如果匹配,则该文件来自Microsoft。如果它们不匹配,则文件已被篡改。

因此,使文件看起来像是由微软“签名”的唯一方法就是窃取他们的私钥。阅读digital signature article on Wikipedia

有关该过程实际运作方式的详细信息,请在MSDN上阅读"Signing and Checking Code with Authenticode""Introduction to Code Signing"

答案 1 :(得分:0)

从内存中签名过程使用public key cryptography

来自维基百科的

This diagram最好地解释了这个过程。

总之,

  

“与发件人签名的邮件   私钥可以由任何人验证   谁有权访问发件人的公开信息   密钥,从而证明发件人   有权访问私钥(和   因此很可能是这个人   与使用的公钥相关联),   和消息的一部分   没被篡改过。“

即。 Sigcheck使用Microsoft的公钥对先前使用Microsoft私钥签名的文件执行验证(当然只有Microsoft可以访问私钥)。

答案 2 :(得分:-1)

建立其他人已发布的内容:

免责声明:MS使用公共/私人密钥术语w.r.t数字签名过去常常让我感到困惑。我刚做了一个'啊哈!'时刻。我会尝试分享我的想法以防万一。

输入PPK


通用公钥 - 私钥方案通过生成一对不对称的密钥来工作。你不能从另一个中获得一个(通过可行的方法)。其中一个称为私钥,另一个称为公钥。

对于一对多通信,您将保留私钥并共享公钥。想要与您共享文档的朋友将使用您的公钥对其进行签名。您将使用您的私钥解密这些。请注意,保留哪个特定密钥以及分发哪个密钥并不重要。只是不要两者都给出。

DigSigs为何与众不同?


数字签名有点奇怪。这是一个多对一的情况。要继续前面的示例:请考虑您希望与朋友共享文档的情况。你需要签名,即加密,你的朋友需要能够解密。因此,您仍然可以共享您的公钥,但请使用您的公钥进行签名并将其发送出去。你的朋友已经有了这把钥匙,他们很高兴解密。在这种情况下,您的公钥充当私钥,您的私钥充当公钥。

以上是MS对其dll所做的事情。

客户端验证


现在,对于验证部分。在证书颁发机构说它是好的之前,由MS生成的证书是没有用的。这适用于任何人。如果您想要安全地开展业务,您必须从CA获得证书。一旦您的客户端安装了您的应用程序,操作系统的验证程序将通过验证名为信任链的内容来删除您的证书并进行测试。它将检查谁签署了您的签名。这是父证书。如果系统可以识别父母,那么他们就完成了,你就被接受了。但是,如果无法验证父母,则调用父母的父母。并且链继续,直到找到可以验证的节点。如果没有找到节点,他们会将其报告为未签名,不安全。

请注意,可以撤消证书。所以,证书并不意味着你很好。这是验证过程变得重要的另一个原因。