我有一个包含签名的 .Net 程序集的 ZIP 文件,是否可以通过一个工具来签署不是代码而是包含这些代码的 ZIP 文件?我希望能够在代码方面使用它,例如:
if(myzipfile.IsSignedBy(name))
{
DezipFile();
LoadAssemblies();
}
我有一个包含签名的 .Net 程序集的 ZIP 文件,是否可以通过一个工具来签署不是代码而是包含这些代码的 ZIP 文件?我希望能够在代码方面使用它,例如:
if(myzipfile.IsSignedBy(name))
{
DezipFile();
LoadAssemblies();
}
你可以签署任何你喜欢的东西,你唯一需要担心的问题是你要在哪里存储签名来验证它。
在 C# 中,您有一个RSACryptoServiceProvider
可以获取密钥对和 abyte[]
并生成它的 RSA 签名的。要验证它,您只需要公钥(不是私钥)、原始数据和生成的签名。
稍微聪明一点,您也许可以将签名附加到 ZIP 文件的末尾,而不会使 ZIP 文件不可读。然后,您将阅读整个 zip 文件(减去存储签名的末尾部分)并使用它进行验证。
您必须将公钥嵌入到您的应用程序中,以便也将其用于验证。
由于只有您拥有用于制作签名的公钥和私钥,因此您可以确定如果签名正确,则 zip 文件来自您。
对任意数量的任何格式的文件进行签名的另一种标准化方法是使用单独的目录文件 (.cat)。这通常用于签署驱动程序,但也用于一些 Microsoft 发布的 ISO。
为此,您需要 Powershell 和一个文件(或文件目录)来签名。
假设您要签名的文件名为 AZipFile.zip。运行以下
New-FileCatalog -Path AZipFile.zip -CatalogFilePath myCatalog.cat -CatalogVersion 2.0
这将创建一个 catelog 文件,但没有签名。图片
运行以下命令以添加签名。需要时间戳服务器,以便签名证书过期后签名仍然有效。替换Cert:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139
为您的证书的路径
Set-AuthenticodeSignature -FilePath myCatalog.cat -Certificate (Get-Item Cert:\CurrentUser\My\18daf8ffb3dc9d84903a9eb65fb8a1970ceb7139) -TimestampServer http://timestamp.comodoca.com
现在目录文件显示一个有效的签名。图片
通过双击 Windows 上的目录文件,您可以查看签名是否有效,以及文件列表及其哈希值。但是,GUI 不能帮助您验证文件。为此,您需要另一个 powershell 命令。
Test-FileCatalog -CatalogFilePath myCatalog.cat -Path AZipFile.zip
如果目录下所有文件的签名都有效,则返回Valid
.
如果您不必使用 ZIP 进行压缩,则另一种格式可能是更好的选择。这个stackoverflow 线程提到 JAR 文件支持签名。
似乎 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