【发布时间】:2010-12-21 06:21:43
【问题描述】:
我正在尝试通过对称密钥加密 SQL Server 中的数据。当用户通过 Web 表单提交数据时,我希望使用我保存在 SQL Server 中的对称密钥对数据进行加密。我试图找出如何做到这一点。目前,我运行以下命令:
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 文件
<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}')" />
try/catch 语句出错:
错误号:102,错误消息:“myKey”附近的语法不正确。在:-2146232060 和 System.Data.SqlClient.SqlErrorCollection
问题/问题:
- 为什么会出现错误?
- 我应该以其他方式访问密钥或加密数据吗?
补充:我尝试将密钥名称从“myKey”更改为“myKeya”或类似的名称,然后出现此错误:
错误号:15151,错误消息:找不到对称密钥“myKeya”,因为它不存在或您没有权限。在:-2146232060 和 System.Data.SqlClient.SqlErrorCollection
当然,我使用的单词与“myKey”不同,但我检查了我使用的单词是否是任何类型的关键字,并且在 google、bing 和 msdn 的任何搜索中都没有出现。 .所以我想我在那里很安全。这也提示我数据库实际上正在接收请求,但它需要一些不同风格的密钥。嗯……
【问题讨论】:
-
您确定错误是在打开密钥而不是调用 submitDataToDb 上吗?
-
有趣的一点...当我运行调试器时,错误发生在 submitDataToDb() 的 sqlCmd.ExecuteNonQuery();... 但是,它指向“OpenKey”的值和表示“myKey”的语法不正确。
-
事实上,亲爱的先生,我认为您可能一针见血……并给我上了宝贵的一课。它在另一个功能中。非常感谢。您应该将其发布为答案,以便我可以接受并给予您信任。 :)
标签: c# sql encryption web-config symmetric-key