Как читать SQL всегда зашифрованный столбец из классического ASP - PullRequest
4 голосов
/ 18 апреля 2019

Я поддерживаю классическое приложение ASP (да, я знаю, мы работаем над этим) и мне нужен доступ к столбцам Always Encrypted в SQL 2017.

Я импортировал сертификат и протестировал в SSMS иPowerShell и так много работает.Лучшее, что я смог сделать в ASP - это получить зашифрованное значение в виде байтового массива.Я перепробовал больше комбинаций строк подключения, чем помню.Мой блок разработки ASP - Windows 10;сервер данных - SQL 2017.

cnn = "Provider=MSOLEDBSQL; DataTypeCompatibility=80; " _
    & "DRIVER={ODBC Driver 17 for SQL Server}; " _
    & "SERVER=xxxx; UID=xxxxx; PWD=xxxxx; DATABASE=xxxx; " _
    & "ColumnEncryption=Enabled; Column Encryption Setting=Enabled;"
Set oDB = CreateObject( "ADODB.Connection" )
oDB.Open cnn
set oCmd = Server.CreateObject("ADODB.Command") 
oCmd.ActiveConnection = cnn
oCmd.CommandText = "SELECT top 10 ID, Enc FROM tbl1"
set rst = oCmd.Execute()

Код работает без ошибок, но зашифрованный столбец (Enc, varchar (50)) возвращается в виде байтового массива.Я, кажется, получаю зашифрованное значение, когда я должен получить текстовое значение.Я также пытался вызвать хранимую процедуру с теми же результатами.Нет фильтра в запросе, так что нечего параметризировать.Есть идеи, что попробовать дальше?


Ответ:
1) Импортируйте сертификат как тот же пользователь, что и идентификатор AppPool для этого веб-приложения.
2) Установите авторизацию Anon для Интернетаприложение для идентификации пула приложений.
3) Используйте эту строку подключения:

  cnn = "Provider=MSDASQL;" _
      & "Extended Properties=""Driver={ODBC Driver 17 for SQL Server};" _
      & "SERVER=***; UID=***; PWD=***;" _
      & "DATABASE=***;ColumnEncryption=Enabled;"" "

1 Ответ

4 голосов
/ 18 апреля 2019

Новый поставщик Microsoft OleDb для SQL Server (MSOLEDBSQL) не поддерживает AlwaysEncrypted (в настоящее время).Вам придется использовать ODBC, а это означает, что поставщик OleDb должен быть поставщиком Microsoft OleDb для ODBC (MSDASQL).Таким образом, вы можете настроить системный DSN с помощью Microsoft® ODBC Driver 17 для SQL Server со строкой подключения, например:

cnn = "Provider=MSDASQL;DSN=testdb;"

, или встроить все параметры драйвера ODBC в «Расширенные свойства» строки подключения MSDASQL.,Как

cnn = "Provider=MSDASQL;Extended Properties=""Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=testdb;Trusted_Connection=yes;ColumnEncryption=Enabled;"" "

Вот пошаговое руководство, использующее первый VBScript для тестирования перед тестированием с ASP.

Начиная с:

create database testdb
go
use testdb

create table tbl1(id int, Enc varchar(200))

insert into tbl1(id,enc) values (1,'Hello')

Затем выполняется мастер шифрования столбцов в SSMS, который хранит сертификат для текущего пользователя на машине с SSMS:

gif of the Column Encryption Wizard

Затем перечисление query.vbs:

cnn = "Provider=MSDASQL;Extended Properties=""Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=testdb;Trusted_Connection=yes;ColumnEncryption=Enabled;"" "
Set oDB = CreateObject( "ADODB.Connection" )
oDB.Open cnn
set oCmd = CreateObject("ADODB.Command") 
oCmd.ActiveConnection = cnn
oCmd.CommandText = "SELECT top 10 ID, Enc FROM tbl1"
set rst = oCmd.Execute()
rst.MoveFirst()
msgbox( cstr(rst("Enc")) )

Который можно запустить из командной строки с помощью:

cscript  .\query.vbs

Чтобы сделать это из ASP, вам дополнительно нужно будет поместить сертификат в хранилище пользовательских сертификатов учетной записи пула приложений IIS, в соответствии сдокументы здесь .Обратите внимание, что относительный путь к сертификату должен быть одинаковым для всех пользователей.Вы не можете сохранить его в хранилище компьютеров в окне IIS, если изначально настроили его для хранения в хранилище сертификатов пользователя.SQL Server хранит key_path ключа и указывает клиентам, где найти сертификат, например, CurrentUser/my/388FF64065A96DCF0858D84A88E1ADB5A927DECE.

. Так что найдите путь к ключу главного ключа столбца

select name, key_path from sys.column_master_keys

Затем экспортируйте сертификат с компьютера, на котором он установлен:

 PS C:\Windows> $path = "cert:\CurrentUser\My\388FF64065A96DCF0858D84A88E1ADB5A927DECE"
 PS C:\Windows> $mypwd = ConvertTo-SecureString -String "xxxxxxx" -Force -AsPlainText
 PS C:\Windows> Export-PfxCertificate -Cert $path -FilePath c:\temp\myexport.pfx -ChainOption EndEntityCertOnly  -Password $mypwd

Работая от имени пользователя пула приложений на сервере IIS, импортируйте его

PS C:\WINDOWS> $mypwd = ConvertTo-SecureString -String "xxxxxxx" -Force -AsPlainText
PS C:\WINDOWS> Import-PfxCertificate -FilePath C:\temp\myexport.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $mypwd

И если вы используете Anonymous/ Формирует проверку подлинности, что вы настроили анонимную проверку подлинности IIS для запуска под удостоверением пула приложений, а не по умолчанию IUSR.

IIS Anonymous Authentication Edit Dialog

Вот ASP-страница для тестирования:

<!DOCTYPE html>
<html>
<body>

<p>Output :</p>

<%

Set objNetwork = CreateObject("Wscript.Network")
Response.write("The current user is " & objNetwork.UserName)

cnn = "Provider=MSDASQL;Extended Properties=""Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=testdb;Trusted_Connection=yes;ColumnEncryption=Enabled;"" "
Set oDB = CreateObject( "ADODB.Connection" )
oDB.Open cnn
set oCmd = CreateObject("ADODB.Command") 
oCmd.ActiveConnection = cnn
oCmd.CommandText = "SELECT top 10 ID, Enc FROM tbl1"
set rst = oCmd.Execute()
rst.MoveFirst()
Response.write(cstr(rst("Enc")) )

%>

</body>
</html>
...