SSRS 経由のレポートを含む Windows/IIS で実行されている Web アプリケーションがあります。
レポートをレンダリングし、Web または SSRS ファイル システムに保存し、暗号化されたバージョンを作成して、その暗号化されたファイルをユーザーに配信できるようにしたいと考えています。
パスワード付きのzipファイルを作成することを検討しましたが、うまくいくかどうかはわかりません.
これを行う最良の方法は何ですか?
SSRS 経由のレポートを含む Windows/IIS で実行されている Web アプリケーションがあります。
レポートをレンダリングし、Web または SSRS ファイル システムに保存し、暗号化されたバージョンを作成して、その暗号化されたファイルをユーザーに配信できるようにしたいと考えています。
パスワード付きのzipファイルを作成することを検討しましたが、うまくいくかどうかはわかりません.
これを行う最良の方法は何ですか?
これにはいくつかの問題があります。暗号化の目的は、許可されたユーザーだけが閲覧できるようにレポートを配布できるようにすることであるという前提に基づいて作業する必要があります。
この目標を達成する最も簡単な方法は、ログイン スキームを用意し、HTTPS 経由でレポートを提供することです。これは、ログインしているユーザーのみがレポートをダウンロードできることを意味し、ネットワーク スニッフィングを使用してレポートを傍受することはできません。
以前、クライアントは、(暗号化されていない) レポートを権限のないユーザーに転送する可能性があるため、暗号化されていないファイルをユーザーにダウンロードさせないようにしたいと主張していました。この要件を満たすために、暗号化された ZIP ファイルを作成する Windows サービスを作成しました。サービスを使用したのは、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 Namespaceを確認する必要があります。