我試圖通過對稱密鑰加密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上的任何搜索中...所以我想我很安全那裏。此外,這也提示我這個數據庫實際上是接收請求的,但它希望在某種不同的方式中使用這個關鍵字。嗯....
你確定錯誤是在打開的鍵而不是對submitDataToDb的調用嗎? – SqlACID 2009-11-29 00:06:58
有趣的一點是...當我運行調試器時,錯誤發生在submitDataToDb()的sqlCmd.ExecuteNonQuery(); ...但是,它指向「OpenKey」的值並且表示存在不正確的語法在「myKey」上。 – 2009-11-29 02:37:32
事實上,親愛的主席先生,我認爲你可能已經在腦海中受到了重創......並且教會了我一個寶貴的教訓。它在另一個功能。非常感謝。您應該將其作爲答案發布,以便我可以接受並給予您信用。 :) – 2009-11-29 17:43:49