2016-11-22 24 views
2

У меня есть ключ и настройка сертификата ok в базе данных, и я могу шифровать ok при вводе запросов напрямую с помощью HeidiSQL. Но проблема, с которой я столкнулась, заключается в том, чтобы заставить это работать с использованием классического asp. Я установил простую таблицу для тестирования, которая содержит столбец автоинкремента и столбец var binary max для хранения зашифрованных данных.Невозможно получить классические ASP-параметры запросов, работающих при использовании шифрования с симметричным ключом

Вот мой код:

chtest.commandtext="OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE [Certificate];" 

set rschtest = chtest.execute 

chtest.commandtext="INSERT into thetable(thevalue) values(?)" 

chtest.Parameters.Append chtest.CreateParameter ("@thevalue", adVarBinary, adParamInput,8000, "EncryptByKey(Key_GUID('SymmetricKey'), 'some text here')" ) 

set rschtest = chtest.execute 

Это похоже на работу, как двоичные данные получает введены в таблицу, но при расшифровке его непосредственно на сервере, то он просто показывает «Null».

Выполнение этих запросов непосредственно на сервере работает, например:

OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE Certificate 
INSERT INTO thetable (thevalue) VALUES (EncryptByKey(Key_GUID('SymmetricKey'), 'some text here')) 

, а затем ...

OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE [Certificate] 
SELECT CONVERT(varchar, DecryptByKey(thevalue)) AS thevalue FROM thetable 

работ и показывает правильное расшифрованный значение.

Я думаю, что проблема при использовании классического метода asp связана с необходимостью вставлять зашифрованную строку в varbinary как varchar? Или что-то вроде этого.

Кроме того, если я не использую параметризованные запросы, все работает нормально, но, очевидно, я хочу использовать подготовленные запросы для обеспечения безопасности.

Обратите внимание, что это устаревшее приложение, поэтому я должен использовать классический asp.

Любая помощь приветствуется.

+0

Ошибка 'CreateParameter()' совершенно неверна, если вы хотите параметризовать значение, которое необходимо применить, к передаваемому базовому значению, чтобы тип данных был 'thevalue' до' EncryptByKey (Key_GUID ('SymmetricKey') , ...) '?, смотрит на меня как' varchar' строку '' некоторый текст здесь''. – Lankymart

ответ

1

Вам нужна небольшая реструктуризация ADODB.Command в настоящий момент, когда звонок .CreateParameter() не имеет смысла. Вы всегда должны передавать базовый тип данных значения через параметры, какие-либо манипуляции впоследствии (в этом случае на EncryptByKey()) должно выполняться в запросе, определяемом CommandText.

Dim sql: sql = "" 

sql = sql & "OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE [Certificate]" & vbCrLf 
sql = sql & "INSERT INTO thetable (thevalue) VALUES (EncryptByKey(Key_GUID('SymmetricKey'), ?))" 

With chtest 
    .ActiveConnection = your_connection_string 
    .CommandText = sql 
    .CommandType = adCmdText 
    Call .Parameters.Append(.CreateParameter("@thevalue", adVarChar, adParamInput, 8000, "some text here") 

    'As you are doing an INSERT use adExecuteNoRecords to cut down on processing 
    'and improve performance. 
    Set rschtest = chtest.Execute(, , adExecuteNoRecords) 
End With 

Вы заметите, что я изменил

.CreateParameter ("@thevalue", adVarBinary, adParamInput,8000, "EncryptByKey(Key_GUID('SymmetricKey'), 'some text here')" ) 

в

.CreateParameter("@thevalue", adVarChar, adParamInput, 8000, "some text here") 

Это происходит потому, что, когда вы манипулируете базовое значение в этом случае строка 'some text here' любые манипуляции это необходимо сделать за пределами передачи базового значения. Вот почему .CommandText теперь содержит EncryptByKey(Key_GUID('SymmetricKey'), ?), поэтому только базовое значение передается через коллекцию Parameter во время выполнения.

+0

Спасибо, что отлично работает. – jzxz234

+0

@ jzxz234 Нет проблем, также если вы хотите расшифровать, вам нужно будет использовать тот же принцип, передайте 'DecryptByKey (?)' В свой 'CommandText', а затем этот параметр будет бинарным на этот раз так что-то вроде'.CreateParameter ("@ thevalue", adVarBinary, adParamInput, 8000, the_binary_value) '. – Lankymart

+0

Объяснение ответов - это немного словесная потребность в тренировке более чистого способа объяснить передачу базового типа данных с помощью запроса. – Lankymart

 Смежные вопросы

  • Нет связанных вопросов^_^