【问题标题】:SQL Symmetric Key and opening it from C#SQL 对称密钥并从 C# 打开它
【发布时间】: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


【解决方案1】:

您是否应该转义或删除网络配置中的分号?只是一个想法,未经测试。

【讨论】:

  • 嗯...我尝试了各种转义方法。也许它的东西我没有尝试?这是我尝试过的: '/myKey/' ; /'我的钥匙'/ ; /我的钥匙/ ; ''myKey'' 并且它都返回一个错误:(
  • 你试过只删除分号吗?就像你的第一个 sql 命令一样。
【解决方案2】:

您不希望在配置文件中单独引用 'myKey'。将您的配置文件与您所说的正确工作的语句进行比较,唯一不同的是引号。查看 SQL Server documentation 也表明密钥和证书都不应该有引号。

【讨论】:

  • 是的,我实际上粘贴了我正在使用 ( ' ) 进行的测试。我尝试了两种方法并得到相同的错误。没有他们,我更新了我的问题。谢谢/抱歉
  • 新错误看起来像是权限错误。您是否以与 Web 应用登录的用户相同的用户身份登录到 MSSQL?
  • 试试看。您的测试也可能会失败,然后查看访问密钥所需的权限并将其提供给 webapp 登录的用户。
【解决方案3】:

尝试使用SQL Server Profiler 运行跟踪。然后,您将能够看到您的 Web 应用程序正在运行的确切语句。从那里您可以将该语句剪切/粘贴到 SQL Server Management Studio 中,并查看它是否运行或有语法错误。如果它确实运行了,那么你会得到一个提示,就像 Donnie 建议的那样,这是一个权限问题。

【讨论】:

  • 我会试试这个!我正在运行 SQL 的 Express 版本,所以我必须安装一个替代版本。
【解决方案4】:

您确定错误是在打开密钥而不是调用 submitDataToDb 上吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多