如何从我的 Web 服务器传送加密文件?
Posted
技术标签:
【中文标题】如何从我的 Web 服务器传送加密文件?【英文标题】:How can I deliver an an encrypted file from my web server? 【发布时间】:2012-05-26 05:41:56 【问题描述】:我有一个在 Windows/IIS 下运行的 Web 应用程序,其中包括一些通过 s-s-rS 生成的报告。
我希望能够呈现报告,以某种方式将其保存在 Web 或 s-s-rS 文件系统上,创建加密版本,并将该加密文件交付给用户。
我考虑过创建一个带有密码的 zip 文件,但不确定它的效果如何。
最好的方法是什么?
【问题讨论】:
通过 HTTPS 提供服务怎么样?如果您担心 s-s-rS 机器的安全性,您可以创建另一个仅用于显示报告或弄清楚如何在不使用 s-s-rS 的情况下呈现 s-s-rS 标记(如果内存服务正确,我相信它是 XML 变体......也许有一些 XSLT 正在进行中......) 您希望用户能够使用此加密报告做什么?对文件的 transit 进行加密是否重要(然后我会像 @Kasapo 所说的那样使用 HTTPS)还是在交付后将它放在加密的容器中很重要? 不,它必须是用户可以保存并随身携带的文件,以便以后打开。 他们得到这个对象后如何解密它?他们有/提供密码吗?还有什么? @Joe - 会有一种机制让用户获得适当的密码。 【参考方案1】:这有几个问题 - 我必须假设加密的目的是您希望能够以只有授权用户才能查看的方式分发报告。
实现此目标的最简单方法是使用登录方案,并通过 HTTPS 提供报告。这意味着只有登录的人才能下载报告,并且无法使用网络嗅探来拦截。
过去,一位客户坚持希望避免允许用户下载未加密的文件,因为他们可能会将(未加密的)报告转发给未经授权的用户。为了满足这个要求,我们创建了一个创建加密 ZIP 文件的 windows 服务;我们使用了一项服务,因为性能测试表明在 Web 请求的上下文中创建 ZIP 会产生严重的可伸缩性问题。
这个方案的主要问题是分发解密密钥;确保每个人都有正确的报告密钥是背后的巨大痛苦。
它也没有阻止用户解密 ZIP 文件并通过电子邮件发送未加密的报告 - 但这显然违反了 IT 政策,这对于未加密的报告来说是一个更难的点。
【讨论】:
存在一些问题,这更多是对安全性的看法而不是实际安全性问题,但有人问我如何实现这一点。报告的输出需要保存到文件中,并在异地进行,因此 HTTPS 没有帮助。他们认为管理密钥会很痛苦。【参考方案2】:可能是 7-zip 或 TrueCrypt?
不过,两者都需要安装额外的软件。我真的不确定 ZIP 文件密码保护有多强,所以如果不做一些研究,我会犹豫走这条路。
据我了解,TrueCrypt 非常安全。
【讨论】:
【参考方案3】:您需要在项目中引用http://<Server Name>/ReportServer/ReportExecution2005.asmx
。请参阅ReportExecutionService.Render Method 中包含的示例,了解如何执行和呈现报告。然后,您可以从 render 方法中获取返回的字节数组,并基于它创建一个 MemoryStream。
您可以使用 System.IO.Compression Namespace 中的东西执行简单的压缩,如下所示:
public void CompressData(Stream uncompressedSourceStream, Stream compressedDestinationStream)
using (DeflateStream compressionStream = new DeflateStream(compressedDestinationStream, CompressionMode.Compress))
uncompressedSourceStream.CopyTo(compressionStream);
public void DecompressData(Stream compressedSourceStream, Stream uncompressedDestinationStream)
using (DeflateStream decompressionStream = new DeflateStream(uncompressedDestinationStream, CompressionMode.Decompress))
compressedSourceStream.CopyTo(decompressionStream);
using (FileStream sourceStream = File.OpenRead(@"C:\MyDir\MyFile.txt))
using (FileStream destinationStream = File.OpenWrite(@"C:\MyDir\MyCompressedFile.txt.cp"))
CompressData(sourceStream, destinationStream)
有关如何加密数据的信息,请参阅AesCryptoServiceProvider Class。修改示例以加密流而不是字符串应该不难。
也可以向用户颁发证书并在此基础上执行加密/解密,但它更复杂。为此,您需要查看System.Security.Cryptography.X509Certificates Namespace。
【讨论】:
以上是关于如何从我的 Web 服务器传送加密文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何让WordPress的blog支持SSL和https加密连接