目前我正在使用Azure Cloud。我想建立一个AzureSQL数据库,并使用AlwaysEncrypted来确保数据"始终加密";-(。此外,我想设置AzureFunctions,它能够连接到数据库,并在中写入记录
我已经建立了一个AzureSQL数据库,但我不知道如何使用它。我开始了两次尝试:
- 直接在SSMS中设置表,在表中填充数据,创建密钥并使用向导对其进行加密。这完全正常,只有在连接到数据库时设置了"AlwaysEncrypted"复选框,我才能看到纯数据
- 我的第二次尝试是将"始终加密"直接包含在查询中。我尝试了以下操作:
CREATE COLUMN MASTER KEY CMK_test_1
WITH (
KEY_STORE_PROVIDER_NAME = 'AZURE_KEY_VAULT',
KEY_PATH = '<PATH_TO_AZURE_KEY_VAULT>'
)
CREATE COLUMN ENCRYPTION KEY CEK_test_1
WITH VALUES
(
COLUMN_MASTER_KEY = CMK_test_1,
ALGORITHM = 'RSA_OAEP',
ENCRYPTED_VALUE = <VALUE>
)
Create Table dbo.AlwaysEncryptedTest
(
ID int identity(1,1) PRIMARY KEY
, FirstName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
, LastName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
, City varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
, StreetName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
)
我知道我必须使用应用程序将记录放入数据库,但我找不到教程或其他帮助我做到这一点的东西。我在微软网站上找到了一些C#解释,但这对我做这项工作没有帮助。在最好的情况下,我会用python编写连接。
感谢您的帮助。
最佳P
如果您想在python应用程序中连接启用always encrypt
的Azure SQL server和Azure密钥库,我们可以使用ODBC驱动程序来实现它。
关于如何实现它,我们需要将ColumnEncryption=Enabled
添加到连接字符串中,以告诉odbc应用程序始终启用加密。此外,由于我们使用Azure密钥库存储,我们还需要添加KeyStoreAuthentication
、KeyStorePrincipalId
和KeyStoreSecret
,以使ODBC应用程序连接Azure密钥库,获得加密密钥。有关更多详细信息,请参阅此处和此处的
例如
- 创建服务主体以连接Azure密钥保管库
az login
az ad sp create-for-rbac --skip-assignment --sdk-auth
az keyvault set-policy --name $vaultName --key-permissions get, list, sign, unwrapKey, verify, wrapKey --resource-group $resourceGroupName --spn <clientId-of-your-service-principal>
- 代码
server = '<>.database.windows.net'
database = ''
username = ''
password = ''
driver= '{ODBC Driver 17 for SQL Server}'
KeyStoreAuthentication='KeyVaultClientSecret'
KeyStorePrincipalId='<clientId-of-your-service-principal>'
KeyStoreSecret='<clientSecret-of-your-service-principal>'
conn_str=f'DRIVER={driver};SERVER={server};PORT=1443;DATABASE={database};UID={username};PWD={password};ColumnEncryption=Enabled;KeyStoreAuthentication={KeyStoreAuthentication};KeyStorePrincipalId={KeyStorePrincipalId};KeyStoreSecret={KeyStoreSecret}'
with pyodbc.connect(conn_str) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM [dbo].[Patients]")
row = cursor.fetchone()
while row:
print (row)
row = cursor.fetchone()