2008-09-12 13 views
6

SQL Server 2005、asp.net、およびado.netを使用してWebアプリケーションを作成する必要があります。このアプリケーションに格納されているユーザーデータの多くは、暗号化する必要があります(HIPAAを読む)。SQL Server 2005の暗号化、asp.netおよびストアドプロシージャ

過去に暗号化が必要なプロジェクトでは、アプリケーションコードで暗号化/復号化されました。しかし、これは一般的にパスワードやクレジットカードの情報を暗号化するためのものでした。このアプリケーションでは、複数のテーブルの列を暗号化する必要があるため、暗号化の責任をデータレイヤーに押し込むことは、特に複数の暗号化タイプに対してSQL Server 2005のネイティブサポートが行われた場合より優れています。 (誰かが実証的な証拠を持っていれば他には確信が持てるかもしれません)

私はBOLと相談しましたが、私はかなりグッドを熟知しています。だから私はオンラインの記事やMSDNのドキュメントへのリンクを望んでいない(おそらく私はそれを読んでいる可能性が高い)。

私が今までに頭を抱えたのは、証明書を使用して開かれた対称キーを使用することです。だから、一回のセットアップ手順は、(理論的にはDBAによって実行される)

  1. CDに焼くとオフサイトに保存し、
  2. にファイルへのマスターキーをバックアップマスターキー
  3. を作成します。
  4. マスターキーを開いて証明書を作成します。
  5. 証明書をファイルにバックアップし、CDに書き込んでオフサイトに保管します。
  6. 証明書を使用して選択した暗号化アルゴリズムで対称鍵を作成します。

ストアドプロシージャ(または管理者による人間ユーザー)が暗号化されたデータにアクセスする必要がある場合は、最初に対称キーを開いてから、tsqlステートメントまたはバッチを実行してから対称キーを閉じます。

asp.netアプリケーションに関する限り、私のケースではアプリケーションコードのデータアクセスレイヤーでは、データの暗号化は完全に透過的です。

は、だから私の質問は以下のとおりです。

  1. は、私は、オープンTSQL文/バッチを実行して、すべてのSPROC内の対称キーを閉じますか?私が見る危険は、何かがtsqlの実行に間違っていて、コードの実行がキーを閉じる文に決して達しない場合です。これは、sqlがsprocが実行されたSPIDを強制終了するまで、キーが開いたままであることを意味します。

  2. 代わりに、実行する必要のある任意のプロシージャ(暗号化が必要な場合のみ)に対して3回のデータベース呼び出しを行うことを検討する必要がありますか?キーを開くデータベース呼び出し、sprocを実行するための2回目の呼び出し、キーを閉じる3回目の呼び出し。

  3. クライアントサイドのトランザクションを使用する必要があります(つまり、自分のコードがクライアントであることを意味します)。トランザクションを実行し、いくつかのsprocsを実行した後、トランザクションは成功したと見なします)。

+0

私の証明書のパスワードをdba(情報を抽出する前にアプリケーション層からキーを開くためにSQL文を実行する)から保護するために2を探しています。それは良い習慣だと思いますか? (http://stackoverflow.com/questions/21213393/sql-server-how-to-limit-access-to-encrypted-column-even-from-dba)。ありがとう –

答えて

3

1)、残念ながらFINALLYありませんSQL 2005年にはtry..catchを使用して調べてください。

2)(1)がクリーンアップを処理する場合は不要です。

3)SQL Serverとのクライアントトランザクションとサーバートランザクションの間に実際の違いはありません。 Connection.BeginTransaction()は、サーバー上で「BEGIN TRANSACTION」を実行します(分散トランザクションに昇格されるまで、System.Transactions/TransactionScopeも同様です)。トランザクション内でキーを複数回開いたり閉じたりすることに対する懸念については、気づいている問題はわかりません。

+0

私は、SQL 2005のCLR機能を使用してストアドプロシージャを実装する予定はありません。むしろプレーンなバニラのtsqlです。または、あなたはtsqlが今try ... catchをサポートしていると言っていますか?もしそうなら、素晴らしい! – Jon

+0

はいSQL 2005は「例外」処理のためにT-SQLにサポートを追加しましたが、MSDNにリンクしませんでした:) BEGIN TRYを検索してください。 – Brannon

+0

非常にクールです。 Brannonに感謝します。 – Jon

0
  1. あなたはどんなエラーがSQLでSPROCの呼び出し中に発生したかどうかを確認するために@@エラーを使用することができます。

  2. 複雑ではありません。

  3. SQL Server自体でトランザクションを使用することができます。あなたが個別に成功し、エラーの両方のケースを処理する必要がありますので、

+0

#2については、暗号化キーの開閉をかなり透過的にする基本的な "データアクセス"クラスがあります。だから、私は複雑さについてあまり心配する必要はありません、追加のデータベーストラフィックについては、データベースとの各対話は少なくとも3つのコマンドを実行する必要があります。 – Jon

1

私はあなたがとにかくどこトランザクションインフラストラクチャを設定するつもりだった分間ふり3.

オプションの大ファンです:データストアへのコールが行われようとしたときはいつでも

  1. 既存のトランザクションが開始されていない場合は、そのトランザクションが作成されました。
  2. トランザクションがすでに行われている場合、そのトランザクションにデータストアのコールがフックされます。これは、データベースへの保存/実行イベントによって発生するビジネス・ルールに役立ちます。 IE。 WidgetAuditテーブルを更新する必要があるウィジェットを販売するたびに、ウィジェットが販売されたことをデータストアに伝えるトランザクションと同じトランザクションでウィジェット監査挿入呼び出しをラップすることをお勧めします。
  3. データストアの元の呼び出し元(手順1)が終了するたびに、トランザクション中に発生したすべてのデータベースアクション(try/catch/finallyを使用)に影響するトランザクションをコミット/ロールバックします。

このタイプのトランザクションが作成されると、トランザクションの開始時にオープンキーをタックし、トランザクションが終了する直前にキーを閉じることが簡単になります。データストアへの「呼び出し」を行うことは、データベースへの接続を開くほど高価ではありません。実際には、(たとえADO.NETがそれらをプールしていても)リソースを焼くSQLConnection.Open()のようなものです。

これらのタイプのコードの例が必要な場合は、NetTierを検討することを検討します。私たちが今説明したトランザクションのための非常にエレガントなソリューションを持っています(あなたが何かを念頭に置いていないと仮定して)。

ちょうど2セント。がんばろう。

+0

タイラーに感謝します。私はフィードバックに感謝します。しかし、私は単一のコマンド(オープンキー、さまざまなSQLステートメント、およびキーを閉じるとsproc)を実行すると、3つのコマンドを実行するよりも優れたパフォーマンスを発揮すると考える必要があります。 – Jon

+0

さらに、トランザクションに関しては、私の好みは一般的にそれらをサーバー側に分離することです。私の傾向は、私がその主張を証明することはできませんが、それが良くなると信じることです。 – Jon

関連する問題