SQL симметричный ключ и открытие его из C # - PullRequest
1 голос
/ 28 ноября 2009

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

Ответы [ 4 ]

0 голосов
/ 15 октября 2012

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

0 голосов
/ 28 ноября 2009

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

0 голосов
/ 28 ноября 2009

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

0 голосов
/ 28 ноября 2009

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

...