C# 对二进制文件进行签名(非代码签名)

C# 对二进制文件进行签名(非代码签名),c#,signing,C#,Signing,有没有办法对二进制文件进行签名?我想对我的zip文件进行签名,以保护它们不受修改(防止安装恶意软件) 对XML进行签名相当容易,但我对二进制文件不太确定。这可能吗?关于这个问题,我所能找到的只是代码签名(这不是我想要的)。购买昂贵的证书是没有用的,只是为了确保更新文件在安装时不会被修改 我想我必须这样做:对文件进行散列,生成密钥对(可能使用散列),然后将签名字节附加到文件中 反之亦然,读取签名字节并根据签名的公钥验证哈希 但我觉得没那么简单。我必须考虑某些事情(比如用XML来规范化)吗?< /P

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

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

我想我必须这样做:对文件进行散列,生成密钥对(可能使用散列),然后将签名字节附加到文件中

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

但我觉得没那么简单。我必须考虑某些事情(比如用XML来规范化)吗?< /P>
我不一定需要代码,但需要一些关于流程的详细解释(任何详细解释的资源也可以).

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

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


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

处理任意二进制文件时,您不能修改其内容,因此如果要对其进行签名,您需要使用一个单独的外部文件,该文件包含要签名的文件的散列,并对其自身进行签名,以防止其被修改

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


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

我不确定“二进制文件”是什么意思,但如果您谈论PE格式(Windows二进制可执行文件),您可以生成自己的签名(加密哈希)并将其放在PE文件中,与Windows authenticode证书所在的位置相同。下面是一个进行此类修改的开源工具:

我不确定您所说的“二进制文件”是什么意思,但如果您谈论PE格式(Windows二进制可执行文件),您可以生成自己的签名(加密哈希),并将其放在PE文件中与Windows authenticode证书所在的同一位置。下面是一个进行此类修改的开源工具:

如果没有验证,签名是没有意义的,您如何计划验证签名是否正确?如果您使用的是安装程序,它们通常都有内置的机制,比如使用。因为它不应该与XML文件不同。我的意思是,为什么公钥要正确验证哈希是否已更改(只要任何字节与原始字节不同,就会发生更改)。据我所知,证书仅用于验证源代码(文件来自于源代码),在本例中,这是毫无意义的,它来自于开发人员。如果有人入侵服务器并修改文件(这样客户就不必担心安装恶意软件),这只是一种保护。没有验证,签名是毫无意义的,您如何计划验证签名是否正确?如果您使用的是安装程序,它们通常都有内置的机制,比如使用。因为它不应该与XML文件不同。我的意思是,为什么公钥要正确验证哈希是否已更改(只要任何字节与原始字节不同,就会发生更改)。据我所知,证书仅用于验证源代码(文件来自于源代码),在本例中,这是毫无意义的,它来自于开发人员。如果有人入侵服务器并修改文件(这样客户就不用担心安装恶意软件),这只是一种保护。这是有道理的。我认为这应该是可能的。我有一个签名的XML包描述文件,其中可能包含密钥,因此这应该可以很好地剪切它。关于证书:自签名证书有用吗?毕竟,他们那时是不值得信任的。那么为什么还要使用它们呢?它不是自签名的,它是由“私有CA”签名的,所有CA证书都是“自签名的”,所有“已安装的CA”都意味着“我将相信这个自签名证书是真实的”。你可以制作你自己的CA并用你的程序分发它的证书。啊,好的,明白了。但是为了避免消息说它不值得信任,你应该考虑从一个认可的CA购买一个,对吗?不,你可以让你的程序在用户的根存储中安装证书,它和VISIGIN或GODAD一样可信。你需要从一个已经建立的CA购买证书的唯一原因是你需要那个“立足点”。在用户的电脑上锚定“信任链”。因为你的程序已经在计算机上了,它可以成为你自己的锚,你不需要依赖别人,这是有道理的。我认为这应该是可能的。我有一个签名的XML包描述文件,其中可能包含密钥,因此这应该可以很好地剪切它