微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用AlwaysEncrypted设置AzureSQL数据库并将其填充数据?

目前,我正在使用Azure云。我想建立一个Azuresql数据库并使用AlwaysEncrypted来确保数据“始终加密” ;-)。此外,我想设置可以连接到数据库以及在其中写入记录的AzureFunction。

我已经设置了一个Azuresql数据库,但是我不知道如何使用它。我开始了两次尝试:

  1. 直接在SSMS中设置表,在表中填写数据,创建密钥并使用向导对其进行加密。这完全可以正常工作,并且只有在连接数据库时设置了“ AlwaysEncrypted”复选框,我才能看到纯数据。
  2. 我的第二个尝试是将“始终加密直接包含在查询中”。我尝试了以下方法
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,City varchar(25) COLLATE latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,StreetName varchar(25) COLLATE latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
)

我知道我必须使用一个应用程序将记录放入数据库中,但是我找不到教程或其他可以帮助我这样做的东西。我在Microsoft网站上发现了一些C#漏洞,但这并没有帮助我完成这项工作。最好的情况下,我会用python编写连接。

感谢您的帮助。

最佳 P

解决方法

如果要连接将always encrypt与python应用程序中的Azure密钥库启用的Azure SQL服务器,我们可以使用ODBC驱动程序来实现它。

关于如何实现它,我们需要在连接字符串中添加ColumnEncryption=Enabled,以告诉odbc应用程序始终启用加密。此外,由于我们使用Azure密钥保管库,因此我们还需要添加KeyStoreAuthentication KeyStorePrincipalIdKeyStoreSecret,以使ODBC应用程序连接Azure密钥保管库,获取加密密钥。 有关更多详细信息,请参阅herehere

例如

  1. 创建服务主体以连接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>
  1. 代码
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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?