Вставьте BLOB-объект в VARBINARY (MAX) в зашифрованную таблицу столбцов на SQL Server, используя pyodbc - PullRequest
0 голосов
/ 04 июня 2018

В настоящее время я изучаю возможность использования функции Always Encrypted для Microsoft SQL Server .Я пытаюсь просто сохранить объект блоба в зашифрованной таблице столбцов («рандомизированной»), используя pyodbc.Если код отлично работает с незашифрованными столбцами для вставки произвольных двоичных объектов, он завершается ошибкой при запуске того же кода в зашифрованном столбце.Еще более странным является тот факт, что он работает для файлов, не относящихся к изображениям, но всякий раз, когда я пытаюсь загрузить PDF, JPEG, PNG или аналогичный файл, происходит сбой.

Код выглядитвот так.

import pyodbc

server   = 'tcp:XXXXX-XXXXXX-XXXXX-XXXXX-XXXXX.windows.net,1433'
database = 'db-encryption'
username = 'XXXXXX@dbs-always-encrypted'
password = 'XXXXXXXXX'

connection_string = [
    'DRIVER={ODBC Driver 17 for SQL Server}',
    'Server={}'.format(server),
    'Database={}'.format(database),
    'UID={}'.format(username),
    'PWD={}'.format(password),
    'Encrypt=yes',
    'TrustedConnection=yes',
    'ColumnEncryption=Enabled',
    'KeyStoreAuthentication=KeyVaultClientSecret',
    'KeyStorePrincipalId=XXXXX-XXXXXX-XXXXX-XXXXX-XXXXX',
    'KeyStoreSecret=XXXXX-XXXXXX-XXXXX-XXXXX-XXXXX'
]

cnxn = pyodbc.connect( ';'.join(connection_string) )
cursor = cnxn.cursor()

insert = 'insert into Blob (Data) values (?)'
files = ['Text.txt', 'SimplePDF.pdf']

for file in files:
    # without hex encode
    bindata = None
    with open(file, 'rb') as f:
        bindata = pyodbc.Binary(f.read())

    # insert binary
    cursor.execute(insert, bindata)
    cnxn.commit()

Сообщение об ошибке, которое я получаю при попытке запустить код в зашифрованном столбце «Данные» (VARBINARY (MAX)), выглядит следующим образом

pyodbc.DataError: ('22018', "[22018] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Operand type clash: image is incompatible with varbinary(max) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'db-encryption') (206) (SQLExecDirectW)")

Кажетсякак драйвер читает байты и видит, что это «известный тип», и обрабатывает данные как «изображение»

Можно ли как-нибудь предотвратить это?Я просто хочу сохранить любой произвольный байтовый объект в указанном столбце.

1 Ответ

0 голосов
/ 22 сентября 2018

Возможно, уже поздно, но проблема в вашем драйвере.Вы должны установить драйвер ODBC 17 или использовать {ODBC Driver 13 для SQL Server}, или вы также можете попробовать {SQL Server}.Скачать драйвер с здесь

...