SQL Server 2005、asp.net、および ado.net を使用して Web アプリケーションを作成する必要があります。このアプリケーションに保存されているユーザー データの多くは、暗号化する必要があります (HIPAA を参照)。
以前は、暗号化が必要なプロジェクトでは、アプリケーション コードで暗号化/復号化を行っていました。ただし、これは通常、パスワードやクレジット カード情報を暗号化するためのものでした。このアプリケーションでは、いくつかのテーブルのはるかに多くの列を暗号化する必要があるため、特に SQL Server 2005 がいくつかの暗号化タイプをネイティブでサポートしていることを考えると、暗号化の責任をデータ レイヤーにプッシュする方がパフォーマンスが向上すると思います。(誰かが実際の経験的証拠を持っていれば、そうではないと確信できます。)
私は BOL に相談したことがありますが、Google の使い方にはかなり慣れています。したがって、オンラインの記事や MSDN のドキュメントへのリンクは必要ありません (既に読んでいる可能性があります)。
これまでに頭を悩ませてきた 1 つのアプローチは、証明書を使用して開かれる対称キーを使用することです。
したがって、1 回限りのセットアップ手順は次のとおりです (理論的には DBA によって実行されます)。
- マスターキーを作成する
- マスター キーをファイルにバックアップし、CD に書き込み、オフサイトに保存します。
- マスター キーを開き、証明書を作成します。
- 証明書をファイルにバックアップし、CD に書き込み、オフサイトに保存します。
- 証明書を使用して、選択した暗号化アルゴリズムで対称キーを作成します。
次に、ストアド プロシージャ (または Management Studio を介した人間のユーザー) が暗号化されたデータにアクセスする必要があるときはいつでも、最初に対称キーを開き、tsql ステートメントまたはバッチを実行してから、対称キーを閉じる必要があります。
次に、asp.net アプリケーションに関する限り、そして私の場合はアプリケーション コードのデータ アクセス レイヤーに関する限り、データ暗号化は完全に透過的です。
だから私の質問は:
開いて、tsql ステートメント/バッチを実行し、対称キーをすべて sproc 内で閉じますか? 私が見る危険は、tsql の実行で何か問題が発生し、コード sproc の実行がキーを閉じるステートメントに到達しない場合です。これは、sproc が実行された SPID を SQL が強制終了するまで、キーが開いたままになることを意味すると思います。
代わりに、実行する必要がある特定のプロシージャに対して 3 つのデータベース呼び出しを行うことを検討する必要がありますか (暗号化が必要な場合のみ)。キーを開くための 1 回のデータベース呼び出し、sproc を実行するための 2 回目の呼び出し、およびキーを閉じるための 3 回目の呼び出し。(開いているキーが最終的に閉じられる可能性を最大化するために、各呼び出しは独自の try catch ループでラップされます。)
クライアント側のトランザクションを使用するために必要な考慮事項はありますか (私のコードはクライアントであり、トランザクションを開始し、いくつかの sproc を実行し、成功すると仮定してトランザクションをコミットすることを意味します)?