簡體   English   中英

如何從Web服務器傳送加密的文件?

[英]How can I deliver an an encrypted file from my web server?

我有一個在Windows / IIS下運行的Web應用程序,其中包括一些通過SSRS生成的報告。

我希望能夠呈現報告,以某種方式將其保存在Web或SSRS文件系統上,創建加密版本,並將該加密文件交付給用戶。

我曾考慮過使用密碼創建一個zip文件,但是不確定該如何工作。

什么是做到這一點的最好方法是什么?

這有兩個問題-我必須假設加密的目的是您希望能夠以只有授權用戶才能查看報告的方式來分發報告。

實現此目標的最簡單方法是擁有登錄方案,並通過HTTPS提供報告。 這意味着只有那些具有登錄權限的用戶才能下載報告,並且不能使用網絡嗅探來截獲報告。

過去,客戶堅持要避免允許用戶下載未加密的文件,因為他們可能會將(未加密的)報告轉發給未授權的用戶。 為了滿足此要求,我們創建了一個Windows服務,該服務創建了加密的ZIP文件。 我們之所以使用一項服務,是因為性能測試表明,在Web請求的上下文中創建ZIP會造成嚴重的可擴展性問題。

這種方案的主要問題是分發解密密鑰。 要確保每個人都擁有正確的報告密鑰,這是一個巨大的難題。

它還沒有阻止用戶解密ZIP文件並通過未加密的報告通過電子郵件發送郵件-但這明顯違反了IT策略,這對於使用未加密的報告來說很難。

也許是7-zip或TrueCrypt?

兩者都需要安裝其他軟件。 我真的不確定ZIP文件的密碼保護有多強,所以我會猶豫不決地進行研究。

據我了解,TrueCrypt是相當安全的。

您的項目中需要引用http://<Server Name>/ReportServer/ReportExecution2005.asmx 有關如何執行和呈現報告,請參見ReportExecutionService.Render方法中包含的示例。 然后,您可以從render方法獲取返回的字節數組,並基於該數組創建MemoryStream。

您可以使用System.IO.Compression命名空間中的東西執行簡單壓縮,如下所示:

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類 修改示例以加密流而不是字符串並不難。

也可以向用戶頒發證書並據此執行加密/解密,但這更加復雜。 為此,您需要查看System.Security.Cryptography.X509Certificates命名空間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM