2009-11-28 43 views
1

我試圖通過對稱密鑰加密SQL Server中的數據。當用戶通過Web表單提交數據時,我希望使用我保存在SQL Server內部的對稱密鑰對數據進行加密。我正試圖找出如何做到這一點。目前,我運行以下命令:SQL對稱密鑰並從C#打開它#

USE myDb 
GO 

OPEN SYMMETRIC KEY myKey 
DECRYPTION BY CERTIFICATE myCert 
GO 

INSERT INTO [myDb].[dbo].[passData] 
      ([userid] 
      ,[passName] 
      ,[passLogin1] 
      ,[passLogin2] 
      ,[passPass1] 
      ,[passPass2] 
      ,[passWebsite] 
      ,[passNote]) 
    VALUES 
      ('1' 
      ,'test_2' 
      ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata1') 
      ,NULL 
      ,ENCRYPTBYKEY(KEY_GUID('myKey'),'somedata2') 
      ,NULL 
      ,NULL 
      ,NULL) 
GO 

這個偉大的工程 - 但是,當我嘗試從我的web.config文件開關鍵,我得到一個錯誤。

C#代碼:

private void openKey(Dictionary<String, String> inputStrings) 
    { 
     try 
     { 
      SqlCommand seeqlCmd = new SqlCommand(); 
      String sqlInfo = ConfigurationManager.AppSettings.Get("OpenKey"); 
      seeqlCmd.CommandText = sqlInfo; 
      seeqlCmd.CommandType = CommandType.Text; 
      seeqlCmd.Connection = __SQLConn; 

      seeqlCmd.ExecuteNonQuery(); 
      submitDataToDb(inputStrings); 
      __SQLConn.Close(); 
     } 
     catch (SqlException err) 
     { 
      // show error commands here 
     } 
    } 

    private void submitDataToDb(Dictionary<String, String> sqlString) 
    { 
     try 
     { 
      SqlCommand sqlCmd = new SqlCommand(); 
      String confSet = ConfigurationManager.AppSettings.Get("DepositPasswordData"); 
      sqlCmd.CommandText = String.Format(confSet, sqlString["userID"], sqlString["passName"], sqlString["loginOne"], sqlString["loginTwo"], sqlString["passOne"], sqlString["passTwo"], sqlString["webSite"], sqlString["passNote"]); 
      sqlCmd.CommandType = CommandType.Text; 
      sqlCmd.Connection = __SQLConn; 

      sqlCmd.ExecuteNonQuery(); 
     } 
     catch (SqlException ex) 
     { 
      // show error commands here 
     } 
    } 

Web.Config文件從try/catch語句

<add key="OpenKey" value="OPEN SYMMETRIC KEY myKey DECRYPTION BY CERTIFICATE myCert"/> 
<add key="DepositPasswordData" value="INSERT INTO Passwords.dbo.userPassData{0} userid, passName, passLogin1, passLogin2, passPass1, passPass2, passWebsite, passNote) VALUES ('{0}', '{1}', 'ENCRYPTBYKEY(KEY_GUID('myKey '),'{2}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{3}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{4}')', 'ENCRYPTBYKEY(KEY_GUID('myKey'),'{5}')', '{6}', '{7}')" /> 

錯誤:

Error Number: 102, Error Message: Incorrect syntax near 'myKey'. in: -2146232060 and System.Data.SqlClient.SqlErrorCollection

問題/問題:

  • 爲什麼我會收到錯誤?
  • 有沒有不同的方法我應該訪問密鑰或加密數據?

另外:我試圖從「的myKey」到「myKeya」或類似的東西,比改變密鑰的名字,我得到這個錯誤:

Error Number: 15151, Error Message: Cannot find the symmetric key 'myKeya', because it does not exist or you do not have permission. in: -2146232060 and System.Data.SqlClient.SqlErrorCollection

自然我使用一個不同於'myKey'的單詞,但我檢查了我正在使用的單詞是否是任何類型的關鍵字,並且它不會出現在谷歌,Bing和MSDN上的任何搜索中...所以我想我很安全那裏。此外,這也提示我這個數據庫實際上是接收請求的,但它希望在某種不同的方式中使用這個關鍵字。嗯....

+1

你確定錯誤是在打開的鍵而不是對submitDataToDb的調用嗎? – SqlACID 2009-11-29 00:06:58

+0

有趣的一點是...當我運行調試器時,錯誤發生在submitDataToDb()的sqlCmd.ExecuteNonQuery(); ...但是,它指向「OpenKey」的值並且表示存在不正確的語法在「myKey」上。 – 2009-11-29 02:37:32

+0

事實上,親愛的主席先生,我認爲你可能已經在腦海中受到了重創......並且教會了我一個寶貴的教訓。它在另一個功能。非常感謝。您應該將其作爲答案發布,以便我可以接受並給予您信用。 :) – 2009-11-29 17:43:49

回答

0

可能是你應該逃避或刪除在網絡配置分號?只是一個想法,沒有經過測試。

+0

嗯...我嘗試了各種逃生方法。也許它不是我想要的東西?這是我試過的:'/ myKey /'; /'我的鑰匙'/ ; /我的鑰匙/ ; ''myKey'',這一切都會返回一個錯誤:( – 2009-11-28 19:24:33

+0

您是否試過在第一個sql命令中刪除分號? – 2009-11-28 23:29:19

0

你不想在配置文件中單獨引用'myKey'。比較你的配置文件和你說的正確的語句,唯一不同的是引號。查看SQL Server documentation還指出密鑰和證書都不應該引用它。

+0

是的,我實際上粘貼了一個測試,我正在用(')進行測試。方式和得到相同的錯誤我沒有他們更新我的問題謝謝/抱歉 – 2009-11-28 19:13:17

+0

新的錯誤看起來像一個權限錯誤您測試登錄到MSSQL作爲Web應用程序登錄爲? – Donnie 2009-11-28 19:31:32

+0

Donnie,我是同一個用戶不是, – 2009-11-28 19:47:29

0

嘗試運行跟蹤SQL Server Profiler。然後,您將能夠看到您的網絡應用正在運行的確切語句。從那裏,您可以將該語句剪切/粘貼到SQL Server Management Studio中,並查看它是否運行或有語法錯誤。如果它運行,那麼你會有一個暗示,這是一個像Donnie建議的權限問題。

+0

我會試試這個! SQL版本,所以我必須安裝一個替代方案。 – 2009-11-29 02:25:30

0

你確定錯誤是在打開的鍵而不是對submitDataToDb的調用嗎?