如何从我的Web服务器提供加密文件?

时间:2012-05-18 16:13:54

标签: asp.net web-applications encryption

我有一个在Windows / IIS下运行的Web应用程序,其中包含一些通过SSRS的报告。

我希望能够呈现报告,以某种方式将其保存在Web或SSRS文件系统上,创建加密版本,并将该加密文件传递给用户。

我考虑使用密码创建一个zip文件,但不确定它的效果如何。

最好的方法是什么?

3 个答案:

答案 0 :(得分:0)

这有几个问题 - 我必须假设加密的目的是你希望能够以只有授权用户才能查看它的方式分发报告。

实现此目标的最简单方法是使用登录方案,并通过HTTPS提供报告。这意味着只有登录的用户才能下载报告,并且无法使用网络嗅探拦截报告。

过去,客户坚持要求他们避免允许用户下载未加密的文件,因为他们可能会将(未加密的)报告转发给未经授权的用户。为了满足这个要求,我们创建了一个创建加密ZIP文件的Windows服务;我们使用了一项服务,因为性能测试表明在Web请求的上下文中创建ZIP会产生严重的可伸缩性问题。

此方案的主要问题是分发解密密钥;确保每个人都有适合他们报告的关键是背后的巨大痛苦。

它也没有阻止用户解密ZIP文件并通过电子邮件发送未加密的报告 - 但这显然违反了IT政策,这对于未加密的报告来说是一个难点。

答案 1 :(得分:0)

也许7-zip或TrueCrypt?

然而,两者都需要安装其他软件。我真的不确定ZIP文件密码保护有多强,所以如果没有一些研究,我会犹豫不决。

根据我的理解,TrueCrypt非常安全。

答案 2 :(得分:0)

您需要在项目中引用http://<Server Name>/ReportServer/ReportExecution2005.asmx。请参阅ReportExecutionService.Render Method中包含的示例,了解如何执行和呈现报告。然后,您可以从render方法中获取返回的byte数组,并根据它创建一个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