使用 .Net 对 zip 文件进行数字签名以供下载的最佳方式是啥

Posted

技术标签:

【中文标题】使用 .Net 对 zip 文件进行数字签名以供下载的最佳方式是啥【英文标题】:Whats the best way digitally sign a zip file for download using .Net使用 .Net 对 zip 文件进行数字签名以供下载的最佳方式是什么 【发布时间】:2010-09-02 09:40:34 【问题描述】:

在通过基于 asp.net 的网站提供下载之前,使用 .Net 对文件服务器端进行数字签名的最佳方式是什么

此外,我如何触发签名检查,从而证明文件在 Web 浏览器的下载过程中未被篡改

【问题讨论】:

HTTPS 将是常规路由。 如果您想将 ZIP 文件设置为“独立”并在以后的任何时间对其进行签名验证,则 HTTPS 将不起作用。 【参考方案1】:

签名不需要包含在 ZIP 文件中,它可以是“分离的”签名。因此,您可以拥有 zip 并允许某人验证 sig,这通常只是一系列十六进制或 base64 字符,与您编写的应用程序带外。

概括地说,签名步骤是:

AsymmetricAlgorithm privateKey = certificate.PrivateKey;
byte[] buffer = Encoding.Default.GetBytes(<data from the zip>);
byte[] signature = privateKey.SignData(buffer, new SHA1Managed());

和验证:

RSACryptoServiceProvider publicKey =  certificate.PublicKey.Key as RSACryptoServiceProvider;
bool verify = publicKey.VerifyData(buffer, new SHA1Managed(), signature);

【讨论】:

【参考方案2】:

您需要定义要保护自己和用户免受哪些风险。虽然 PKWare 的 ZIP 格式的 AppNote 将数字签名定义为格式的一部分,但我怀疑是否存在很多解压缩程序,它们正确支持 ZIP 文件中数字签名的验证。

如果担心中途会修改文件内容,有以下选择: 1)HTTPS,如上所述 2) PGP 签名包。您可以为您分发的现有 ZIP 存档创建一个分离的签名并将签名放在下载链接附近,或者,如果您的目标是 Windows,则创建自解压 PGP 存档。 PGP 格式也包括压缩。在这两种情况下,您都需要将您的公共 PGP 密钥放入您的站点。但请注意,如果您以这种方式分发文件,更改文件的人也可以更改公钥。

【讨论】:

【参考方案3】:

如果没有客户端插件或下载管理器,您将无能为力。保护它的最佳方法是使用 HTTPS,但如果这不是一个选项,那么确保完整性的常用方法是在最终用户可以验证的站点上提供文件的 MD5 哈希。如果您将其作为文件下载进行,那么您无法在没有插件的情况下真正在客户端自动执行该验证,因为 javascript 等将无法访问该文件以对其进行验证。

【讨论】:

如果您希望 ZIP 文件“独立”并在将来的任何时间对其进行签名验证,则 HTTPS 将不起作用。不要使用 MD5,现在已知它很弱,最少使用 SHA1,或者更强(SHA256 等)

以上是关于使用 .Net 对 zip 文件进行数字签名以供下载的最佳方式是啥的主要内容,如果未能解决你的问题,请参考以下文章

打开文件,写入文件,将文件保存为 zip 并流式传输给用户以供下载

无法即时生成 ZIP 文件并将其发送到用户的浏览器以供下载

如何通过 .NET 使用 RSA 和 SHA256 对文件进行签名?

zookeeper分布式锁

对包含数字字符串的文件名数组进行排序

如何生成iPhone模拟器构建或.zip文件,以便在Facebook中提交以供iOS审核