Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何像签署程序集一样签署ZIP文件?_C#_.net_Assemblies_Signing - Fatal编程技术网

C# 如何像签署程序集一样签署ZIP文件?

C# 如何像签署程序集一样签署ZIP文件?,c#,.net,assemblies,signing,C#,.net,Assemblies,Signing,我有一个包含签名的.Net程序集的ZIPfile,是否可以通过一个工具来签名而不是代码,而是包含这些程序集的ZIPfile?我希望能够在代码方面使用它,比如: if(myzipfile.IsSignedBy(name)) { DezipFile(); LoadAssemblies(); } 你可以签署任何你喜欢的东西,你唯一需要担心的问题是你将在哪里存储签名来验证它 在C#中,您有一个rsacyptoserviceprovider,它可以获取一个密钥对和一个字节[],并生成它的

我有一个包含签名的.Net程序集的ZIPfile,是否可以通过一个工具来签名而不是代码,而是包含这些程序集的ZIPfile?我希望能够在代码方面使用它,比如:

if(myzipfile.IsSignedBy(name))
{
    DezipFile();
    LoadAssemblies();
}

你可以签署任何你喜欢的东西,你唯一需要担心的问题是你将在哪里存储签名来验证它

在C#中,您有一个
rsacyptoserviceprovider
,它可以获取一个密钥对和一个
字节[]
,并生成它的RSA签名。要验证它,您只需要公钥(不是私钥)、原始数据和生成的签名

稍微聪明一点,您也许可以将签名附加到ZIP文件的末尾,而不会使ZIP文件无法读取。然后读取整个zip文件(减去存储签名的末尾部分),并使用该文件进行验证

您必须将公钥嵌入到应用程序中,以便使用它进行验证


由于只有您拥有用于生成签名的公钥和私钥,因此您可以确保如果签名正确,则zip文件来自您。

如果不必使用zip进行压缩,则另一种格式可能是更好的选择。这提到JAR文件支持签名。

看起来ZIP本身并没有广泛使用的签名标准,但有几种基于ZIP的格式定义了数字签名。其中与.NET最相关的必须是开放式打包约定(Word/Excel文档或Visual Studio extensions的容器格式),此处描述的数字签名:

另一种对任意数量的任何格式文件进行签名的标准化方法是使用单独的目录文件(.cat)。这通常用于签署驱动程序,但也用于某些Microsoft发布的ISOs

你得到了什么

如何创建 为此,您需要Powershell和一个要签名的文件(或文件目录)

假设您要签名的文件名为AZipFile.zip。运行以下命令

newfilecatalog-Path AZipFile.zip-CatalogFilePath myCatalog.cat-CatalogVersion 2.0

这将创建一个catelog文件,但没有签名

运行以下命令以添加签名。需要时间戳服务器,以便签名证书过期后签名仍然有效。将
Cert:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139替换为您的证书路径

Set AuthenticodeSignature-FilePath myCatalog.cat-Certificate(获取项目证书:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139)-时间戳服务器http://timestamp.comodoca.com

现在,目录文件显示了一个有效的签名

如何验证 通过双击windows上的目录文件,可以查看签名是否有效,以及文件及其哈希列表。但是,GUI不能帮助您验证文件。为此,您需要另一个powershell命令

testfilecatalog-CatalogFilePath myCatalog.cat-Path AZipFile.zip


如果目录下所有文件的签名都有效,它将返回
valid

您可以在Zip文件上输入密码吗?这不是目标,我不想保护Zip文件不被读取,我想签名(证明它是由实体X创建的)我不想嵌入签名,这不是签名(我不在乎zip文件是否不可读,它可能是zip或其他任何东西,我不需要格式来“支持它”,我想使用一个文件“bla”,用我用于签名程序集(pfx文件)的相同签名对其进行签名(如果没有人可以读取它就好了),以便能够验证它并最终得到原始的未签名文件。(我正在制作一个插件系统,我想在我的应用程序中的插件激活菜单上显示“plugin X Make by X corporation”,一个插件是多个dll+其他文件,我想确保没有任何内容被篡改)然后按照我说的做,并将签名保存在另一个文件中。您可以使用
X509Certificate2
对象读取您的pfx文件并提取PPK以用于
RSACryptServiceProvider
,然后使用
RSACryptServiceProvider.SignHash
生成签名。嵌入sig仍在签名(您已签名的可执行文件毕竟已嵌入其签名)但是,如果你想让它对任何文件都有效,那么最好将sig保存在一个单独的文件中。我对它的工作原理感到困惑,我想当你签署一个exe时,签名被嵌入了,但整个可执行文件都被修改了没有?否则你怎么能确认文件没有被篡改?(如果您仅附加签名,则有人可以更改文件并复制/粘贴签名)。因为当您尝试验证签名时,它将不匹配-因为它必须是使用原始公钥创建的签名才能工作。签名是整个文件的加密哈希。我发现我很困惑,因此此解决方案适用于任何文件格式。是否有工具可用于对文件进行签名,或者我需要由ha进行签名nd?我知道对于代码,我可以使用一个工具,但我不知道我是否可以让它像那样自动工作?任何允许我有多个文件并且可以读取(本机或纯.net插件,付费或免费)的AMT文件都是一个选项。我可以用我用来签名代码的相同签名来签名吗?(pfx文件)?JAR文件是应用了某些附加约定的ZIP文件。已经有一些工具对JAR文件进行了签名。Link是半死的。它可以解析和加载,但没有它,页面上的关键图像都无法解析,内容也无法完全理解。目标是能够从.net验证签名,显示的所有内容都是comm而且line和GUI是可查看的,我对此进行了升级,但除非有办法创建.cab,对它们进行签名并从.net验证,否则当前接受的答案会更好fit@RonanThibaudau说得好,我没意识到