我目前正在调查 Microsoft SQL Server 的始终加密功能的使用情况。我试图使用pyodbc将blob对象简单地存储在列加密表中(随机化')。如果代码在非加密列上完全正常工作以插入任意二进制对象,则在加密的列上运行相同的代码时,它会失败。更奇怪的是,它适用于非图像文件,但每当我尝试上传 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()
尝试在加密的数据'上运行代码时收到的错误消息column(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)")
似乎驱动程序读取字节并看到它是一种已知的类型'并将数据视为' image'
有什么方法可以阻止这种情况发生吗?我只是想在所述列中存储任意字节对象。
答案 0 :(得分:0)
可能已经晚了,但问题出在您的驱动程序上。您必须安装ODBC 17驱动程序或使用{用于SQL Server的ODBC驱动程序13},也可以尝试使用{SQL Server}。 从here
下载驱动程序