如何签署一个Zip文件,就像我会签署一个程序集?

时间:2013-05-20 14:40:23

标签: c# .net assemblies signing

我有一个包含已签名的.net程序集的Zip文件,是否可以通过工具签名而不是代码,但是包含这些文件的zip文件呢?我希望能够在代码方面使用它来说明如下:

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

4 个答案:

答案 0 :(得分:3)

您可以签署任何您喜欢的内容,您唯一需要担心的问题是您要存储签名以进行验证。

在C#中,你有一个RSACryptoServiceProvider可以使用密钥对和byte[]并生成一个RSA签名。要验证它,您只需要公钥(不是私钥),原始数据和生成的签名。

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

您必须在应用程序中嵌入公钥才能将其用于验证。

由于只有你拥有用于签名的公钥和私钥,所以你可以确定如果签名是正确的,那么zip文件来自你。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

似乎ZIP本身没有广泛使用的签名标准,但有几种基于ZIP的格式定义了数字签名。与.NET相关的大部分内容必须是Open Packaging Conventions(Word / Excel文档或Visual Studio扩展的容器格式),此处描述的数字签名:https://msdn.microsoft.com/en-us/library/windows/desktop/dd742818(v=vs.85).aspx#digital_signatures

答案 3 :(得分:1)

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

你得到什么

enter image description here

如何创建

为此,您需要Powershell和一个文件(或文件目录)进行签名。

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

WRITE_EXTERNAL_STORAGE

这将创建一个类别日志文件,但没有签名。 Image

运行以下命令以添加签名。需要时间戳服务器,以便签名证书过期后签名仍然有效。将New-FileCatalog -Path AZipFile.zip -CatalogFilePath myCatalog.cat -CatalogVersion 2.0替换为证书的路径

Cert:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139

现在目录文件显示有效签名。 Image

如何验证

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

Set-AuthenticodeSignature -FilePath myCatalog.cat -Certificate (Get-Item Cert:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139) -TimestampServer http://timestamp.comodoca.com

如果对目录下所有文件的签名均有效,则返回Test-FileCatalog -CatalogFilePath myCatalog.cat -Path AZipFile.zip