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