Python 如何使用AlwaysEncrypted设置AzureSQL数据库并用数据填充?

Python 如何使用AlwaysEncrypted设置AzureSQL数据库并用数据填充?,python,azure,azure-sql-database,always-encrypted,Python,Azure,Azure Sql Database,Always Encrypted,目前我正在使用Azure云。我想建立一个AzureSQL数据库,并使用AlwaysEncrypted确保数据“始终加密”;-)。此外,我想设置AzureFunctions,它能够连接到数据库并在中写入记录 我已经建立了AzureSQL数据库,但我不知道如何使用它。我开始了两次尝试: 直接在SSMS中设置表,在表中填充数据,创建密钥并使用向导对其进行加密。这工作完全正常,只有在连接到数据库时设置“AlwaysEncrypted”复选框,我才能看到普通数据 我的第二次尝试是在查询中直接包含“始终加密

目前我正在使用Azure云。我想建立一个AzureSQL数据库,并使用AlwaysEncrypted确保数据“始终加密”;-)。此外,我想设置AzureFunctions,它能够连接到数据库并在中写入记录

我已经建立了AzureSQL数据库,但我不知道如何使用它。我开始了两次尝试:

  • 直接在SSMS中设置表,在表中填充数据,创建密钥并使用向导对其进行加密。这工作完全正常,只有在连接到数据库时设置“AlwaysEncrypted”复选框,我才能看到普通数据
  • 我的第二次尝试是在查询中直接包含“始终加密”。我尝试了以下方法:
  • 创建列主密钥CMK\u测试\u 1
    与(
    密钥存储\u提供程序\u名称='AZURE\u密钥库',
    密钥路径=“”
    )   
    创建列加密密钥CEK_test_1
    有价值
    (  
    列\u主\u键=CMK\u测试\u 1,
    算法='RSA_OAEP',
    加密的_值=
    )
    创建表dbo.AlwaysEncryptedTest
    (
    ID int标识(1,1)主键
    ,FirstName varchar(25)校对拉丁文1_General_BIN2,用(
    加密类型=随机化,
    算法='AEAD_AES_256_CBC_HMAC_SHA_256',
    列\u加密\u密钥=CEK\u测试\u 1)不为空
    ,LastName varchar(25)校对拉丁文1_General_BIN2,用(
    加密类型=随机化,
    算法='AEAD_AES_256_CBC_HMAC_SHA_256',
    列\u加密\u密钥=CEK\u测试\u 1)不为空
    ,City varchar(25)校对拉丁文1_General_BIN2,用(
    加密类型=随机化,
    算法='AEAD_AES_256_CBC_HMAC_SHA_256',
    列\u加密\u密钥=CEK\u测试\u 1)不为空
    ,StreetName varchar(25)校对拉丁文1_General_BIN2,用(
    加密类型=随机化,
    算法='AEAD_AES_256_CBC_HMAC_SHA_256',
    列\u加密\u密钥=CEK\u测试\u 1)不为空
    )
    
    我知道我必须使用应用程序将记录放入数据库,但我找不到教程或其他帮助我这样做的东西。我在微软的网站上找到了一些解释,但这并没有帮助我完成这项工作。在最好的情况下,我会用python编写连接

    感谢您的帮助

    最好的
    P

    如果您想连接Azure SQL server,它在python应用程序中使用Azure密钥库启用<代码>始终加密,我们可以使用ODBC驱动程序来实现它

    关于如何实现它,我们需要在连接字符串中添加
    columnecryption=Enabled
    ,以告知odbc应用程序始终加密已启用。此外,由于我们使用Azure密钥库存储,我们还需要添加
    KeyStoreAuthentication
    keystorencipalid
    keystorecret
    以使ODBC应用程序连接Azure密钥库,获取加密密钥。 有关更多详细信息,请参阅和

    比如说

  • 创建服务主体以连接Azure key vault
  • az登录
    az ad sp为rbac创建--跳过分配--sdk身份验证
    az keyvault集策略--name$vaultName--密钥权限获取、列表、签名、解除密钥、验证、wrapKey--资源组$resourceGroupName--spn
    
  • 代码
  • server='.database.windows.net'
    数据库=“”
    用户名=“”
    密码=“”
    驱动程序=“{SQL Server的ODBC驱动程序17}”
    KeyStoreAuthentication='KeyVaultClientSecret'
    keystorencipalid=“”
    KeyStoreCret=“”
    conn_str=f'DRIVER={DRIVER};服务器={SERVER};端口=1443;数据库={DATABASE};UID={username};PWD={password};ColumnEncryption=已启用;KeyStoreAuthentication={KeyStoreAuthentication};KeyStorePrincipalId={KeyStorePrincipalId};KeyStoreCret={KeyStoreCret}'
    使用pyodbc.connect(conn_str)作为连接:
    使用conn.cursor()作为光标:
    cursor.execute(“从[dbo].[Patients]]中选择*”)
    row=cursor.fetchone()
    而行:
    打印(行)
    row=cursor.fetchone()
    
    t非常感谢您的帮助。我一有时间就会试试这个:——)@Pet你还有其他问题吗?
    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
    )
    
    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()