签署二进制文件(不是代码签名)

Posted

技术标签:

【中文标题】签署二进制文件(不是代码签名)【英文标题】:Signing binary files (not code signing) 【发布时间】:2016-02-25 15:09:20 【问题描述】:

有没有办法对二进制文件进行签名?我想签署我的 zip 文件以保护它们不被修改(以防止安装恶意软件)。

签署 XML 相当容易,但我不太确定二进制文件。这甚至可能吗?关于这件事,我能找到的只是代码签名(这不是我想要的)。购买昂贵的证书是没有用的,只是为了确保更新文件在安装时不被修改。

我认为我必须这样工作:对文件进行哈希处理,生成密钥对(可能使用哈希),然后将签名字节附加到文件中。

反之亦然,读取签名字节并根据签名的公钥验证哈希。

但我认为事情没有那么简单。我是否必须考虑某些事情(例如需要规范化的 XML)?

我不一定需要代码,但需要一些关于该过程的详细说明(任何能够彻底解释的资源也可以)。

【问题讨论】:

签名没有验证是没有意义的,你打算如何验证签名是否正确?如果您使用的是安装程序,他们通常会为此内置机制,例如使用 a catalog file。 因为它不应该与 XML 文件不同。我的意思是,如果散列已更改(只要任何字节与原始字节不同,就会发生这种情况),为什么要正确验证公钥。证书 - 据我所知 - 仅用于验证源(该文件来自何处),在这种情况下是毫无意义的 - 它来自开发人员。如果有人入侵服务器并修改文件,这只是一种保护(这样客户就不必担心安装恶意软件)。 【参考方案1】:

在处理任意二进制文件时,您无法修改其内容,因此如果您想对它们进行签名,您需要使用一个单独的外部文件,该文件包含您要签名的文件的哈希值,并对其自身进行签名以防止正在修改中。

然后您阅读这个单独的文件,验证其个人签名,然后验证其内容中列出的每个文件的哈希值。您可以使用 Windows 内置的 Catalog Files(使用 MakeCat 和 SignTool 创建它们)或按照相同的过程创建自己的。

因为您只是分发更新,并且如果允许您假设加载更新的程序没有被修改,您不需要“购买”证书。您可以创建自己的“私有 CA”,在更新程序中分发该 CA 的证书,然后使用该私有 CA 的证书来验证目录文件。

【讨论】:

有道理。嗯,我认为这应该是可能的。我有一个签名的 XML 包描述文件,其中可能包含密钥,所以这应该很好地削减它。关于证书:自签名证书有用吗?毕竟他们不值得信任。那为什么还要使用它们呢? 它不是自签名的,它是由“私人 CA”签名的,所有 CA 证书都是“自签名”,所有作为“已安装 CA”的意思是“我要信任这个自己签署的证书是真实的”。您可以制作自己的 CA 并将其证书与您的程序一起分发。 嗯,好的,明白了。但是为了避免消息说它不值得信任,您应该考虑从获得批准的 CA 购买一个,对吗? 不,您可以让您的程序将证书安装在用户的根存储中,这样它就会变得像 Verisign 或 GoDaddy 一样受信任。 需要从已建立的 CA 购买证书的唯一原因是您需要在用户计算机中的“立足点”来锚定“信任链”。因为你的程序已经在电脑上,它可以自己做主播,你不需要依赖别人。【参考方案2】:

我不确定您所说的“二进制文件”是什么意思,但是如果您谈论 PE 格式(Windows 二进制可执行文件),您可以生成自己的签名(加密哈希)并将其放在 PE 文件中的相同位置Windows 验证码证书去。这是进行此类修改的开源工具: http://blog.didierstevens.com/programs/disitool/

【讨论】:

我的意思是不是纯文本的文件,但基本上每个文件都是二进制文件(对不起,误导性的标题)。我已经设法使用斯科特张伯伦在他的回答中提到的方法签署了一份文件。我已经有了一个单独的 XML 文件,我可以在其中存储文件的签名。不过,感谢您提供的信息 - 以后可能会派上用场。

以上是关于签署二进制文件(不是代码签名)的主要内容,如果未能解决你的问题,请参考以下文章

带有无效签名的无效二进制文件

用于签署应用程序的证书的哪些信息存储在应用程序中?

有没有办法使用过期证书签署二进制文件?

如何验证我的组织是不是签署了受信任的 Windows 二进制文件?

验证可执行文件是不是已签名(用于签署该 exe 的signtool)

大会imul签署