簡體   English   中英

SQL Server 2005加密,asp.net和存儲過程

[英]SQL Server 2005 Encryption, asp.net and stored procedures

我需要使用SQL Server 2005,asp.net和ado.net編寫Web應用程序。 存儲在此應用程序中的大部分用戶數據必須加密(讀取HIPAA)。

過去,對於需要加密的項目,我在應用程序代碼中加密/解密。 但是,這通常用於加密密碼或信用卡信息,因此在幾個表中只有少數列。 對於這個應用程序,需要對幾個表中的更多列進行加密,因此我懷疑將加密職責推入數據層的性能會更好,特別是考慮到SQL Server 2005對多種加密類型的本機支持。 (如果有人有真實的經驗證據,我可能會相信。)

我咨詢了BOL,而且我很擅長使用谷歌。 所以我不希望鏈接到在線文章或MSDN文檔(可能我已經閱讀過了)。

到目前為止,我已經掌握了一種方法是使用一個使用證書打開的對稱密鑰。

所以一次性設置步驟(理論上由DBA執行):

  1. 創建主密鑰
  2. 將主密鑰備份到文件,刻錄到CD並存儲在場外。
  3. 打開主密鑰並創建證書。
  4. 將證書備份到文件,刻錄到CD並存儲在場外。
  5. 使用證書創建具有所選加密算法的對稱密鑰。

然后,只要存儲過程(或通過Management Studio的人類用戶)需要訪問加密數據,您必須首先打開對稱密鑰,執行任何tsql語句或批處理,然后關閉對稱密鑰。

那么就asp.net應用程序而言,在我的情況下是應用程序代碼的數據訪問層,數據加密是完全透明的。

所以我的問題是:

  1. 我是否要打開,執行tsql語句/批處理,然后在sproc中關閉對稱密鑰? 我看到的危險是,如果tsql執行出現問題,代碼sproc執行永遠不會到達關閉密鑰的語句。 我假設這意味着密鑰將保持打開,直到sql殺死sproc執行的SPID。

  2. 我應該考慮為我需要執行的任何給定過程進行三次數據庫調用(僅在需要加密時)? 一個數據庫調用打開密鑰,第二個調用執行sproc,第三個調用關閉密鑰。 (每個調用都包含在自己的try catch循環中,以最大化開放鍵最終關閉的幾率。)

  3. 我需要使用客戶端事務的任何注意事項(意味着我的代碼是客戶端,啟動事務,執行多個sprocs,然后假定成功提交事務)?

1)考慮在SQL 2005中使用TRY..CATCH。不幸的是沒有最終,所以你必須單獨處理成功和錯誤情況。

2)如果(1)處理清理,則沒有必要。

3)與SQL Server的客戶端和服務器事務之間沒有真正的區別。 Connection.BeginTransaction()或多或少在服務器上執行“BEGIN TRANSACTION”(並且System.Transactions / TransactionScope執行相同操作,直到它被提升為分布式事務)。 至於在交易中多次打開/關閉密鑰的問題,我不知道有任何問題需要注意。

我是選項3的忠實粉絲。

假裝你要設置交易基礎設施一分鍾,其中:

  1. 如果尚未啟動現有事務,那么只要對數據存儲區進行調用,就會創建一個。
  2. 如果事務已經存在,則調用數據存儲掛鈎到該事務中。 這通常適用於由保存/轉到數據庫事件引發的業務規則。 IE瀏覽器。 如果您有一條規則,每當您銷售一個小部件時,您需要更新WidgetAudit表,您可能希望將小部件審計插入調用包裝在與告訴數據存儲區小部件已售出的事務相同的事務中。
  3. 每當數據存儲區的原始調用者(來自步驟1)完成時,它就會提交/回滾事務,這會影響在調用期間發生的所有數據庫操作(使用try / catch / finally)。

一旦創建了這種類型的事務處理,就可以在開始時(當事務打開時)開啟一個打開的密鑰並在結束時(在事務結束之前)關閉密鑰。 對數據存儲區進行“調用”並不像打開與數據庫的連接那樣昂貴。 它真的像SQLConnection.Open()那樣會燒掉資源(即使ADO.NET正在為你匯集它們)。

如果你想要一個這類代碼的例子我會考慮看NetTiers。 它為我們剛剛描述的交易提供了一個非常優雅的解決方案(假設您還沒有考慮到某些事情)。

只需2美分。 祝好運。

  1. 您可以使用@@ error來查看在SQL中調用sproc期間是否發生任何錯誤。

  2. 不要復雜。

  3. 您可以,但我更喜歡在SQL Server本身中使用事務。

暫無
暫無

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

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