Симметричный ключ SQL и его открытие из С#

Я пытаюсь зашифровать данные в SQL Server с помощью симметричного ключа. Когда пользователь отправляет данные через веб-форму, я хотел бы, чтобы данные были зашифрованы с использованием моего симметричного ключа, который я сохранил в 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... поэтому я думаю, я в безопасности там. Также это подсказывает мне, что БД на самом деле получает запрос, но ему нужен ключ в какой-то другой форме. хм....


person Tomasz Iniewicz    schedule 28.11.2009    source источник
comment
Вы уверены, что ошибка связана с открытием ключа, а не с вызовом submitDataToDb?   -  person SqlACID    schedule 29.11.2009
comment
интересный момент... когда я запустил отладчик, ошибка возникает в sqlCmd.ExecuteNonQuery() submitDataToDb();... однако она указывает на значение OpenKey и говорит, что в myKey неправильный синтаксис.   -  person Tomasz Iniewicz    schedule 29.11.2009
comment
На самом деле Уважаемый сэр, я думаю, вы попали в самую точку... и преподали мне ценный урок. Это в другой функции. Спасибо большое. Вы должны опубликовать это как ответ, чтобы я мог принять его и отдать вам должное. :)   -  person Tomasz Iniewicz    schedule 29.11.2009


Ответы (4)


Может быть, вам следует экранировать или удалить точки с запятой в веб-конфигурации? просто идея, не проверенная.

person j.a.estevan    schedule 28.11.2009
comment
хм... я пробовал разные способы побега. Возможно, я что-то не так пытаюсь? Вот что я пробовал: '/myKey/' ; /'мой ключ'/ ; /мой ключ/ ; ''myKey'' и все это возвращает ошибку :( - person Tomasz Iniewicz; 28.11.2009
comment
вы пробовали просто удалить точки с запятой? как в вашей первой команде sql. - person j.a.estevan; 29.11.2009

Вам не нужны одиночные кавычки вокруг 'myKey' в вашем файле конфигурации. Сравните свой файл конфигурации с утверждением, которое, как вы сказали, работает правильно, единственное, что отличается, это кавычки. Просмотр документации SQL Server также показывает, что ни ключ, ни сертификат должны быть заключены в кавычки.

person Donnie    schedule 28.11.2009
comment
да, я на самом деле вставил тест, который я делал с ( ' ). Я пробовал оба способа и получаю ту же ошибку. Я обновил свой вопрос без них. Спасибо/извините - person Tomasz Iniewicz; 28.11.2009
comment
Новая ошибка выглядит как ошибка прав доступа. Вы тестируете вход в MSSQL как тот же пользователь, что и веб-приложение? - person Donnie; 28.11.2009
comment
Попытайся. Ваш тест, вероятно, также не удастся, затем изучите необходимые разрешения для доступа к ключу и предоставьте их пользователю, под которым входит веб-приложение. - person Donnie; 28.11.2009

Попробуйте выполнить трассировку с помощью профилировщика SQL Server. Тогда вы сможете увидеть точное утверждение о том, что ваше веб-приложение работает. Оттуда вы можете вырезать/вставить этот оператор в SQL Server Management Studio и посмотреть, работает ли он или имеет синтаксическую ошибку. Если он запустится, у вас будет подсказка, что это проблема с разрешениями, как предположил Донни.

person nick    schedule 28.11.2009
comment
Я попробую это! Я использую экспресс-версию SQL, поэтому мне нужно установить альтернативу. - person Tomasz Iniewicz; 29.11.2009

Вы уверены, что ошибка связана с открытием ключа, а не с вызовом submitDataToDb?

person SqlACID    schedule 15.10.2012