教程:使用具有安全 enclave 的 Always Encrypted 开发 .NET 应用程序
适用于: SQL Server 2019 (15.x) 及更高版本 - 仅限 Windows Azure SQL 数据库
适用于: .NET Framework .NET Core .NET Standard
本教程介绍如何开发应用程序,该应用程序可发出使用具有安全 enclave 的 Always Encrypted 的服务器端安全 enclave 的数据库查询。
先决条件
在执行本教程中的以下步骤之前,请确保已完成开始使用具有安全 enclave 的 Always Encrypted 教程之一。
此外,还需要 Visual Studio(推荐使用 2022 版)- 可从 https://visualstudio.microsoft.com/ 下载。 应用程序开发环境必须使用 .NET Framework 4.6.1 或更高版本/.NET Core 3.1 或更高版本。
步骤 1:创建 Visual Studio 项目
若要在 .NET Framework 应用程序中使用具有安全 enclave 的 Always Encrypted,需要确保应用程序面向 .NET Framework 4.6.1 或更高版本。 若要在 .NET Core 应用程序中使用具有安全 enclave 的 Always Encrypted,需要确保应用程序面向 .NET Core 3.1 或更高版本。
此外,如果将列主密钥存储在 Azure Key Vault 中,还需要将应用程序与 Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider NuGet 集成。
打开 Visual Studio。
新建 C# 控制台应用 (.NET Framework/Core) 项目。
请确保项目至少面向 .NET Framework 4.6 或 .NET Core 3.1。 在“解决方案资源管理器”中右键单击项目,选择“属性”,然后设置目标框架。
通过转到“工具”(主菜单)>“NuGet 包管理器”>“包管理器控制台”安装以下 NuGet 包。 在“包管理器控制台”中运行以下代码。
Install-Package Microsoft.Data.SqlClient -Version 5.0.1
如果使用 Azure Key Vault 来存储列主密钥,通过转到“工具”(主菜单)>“NuGet 包管理器”>“包管理器控制台”安装以下 NuGet 包。 在“包管理器控制台”中运行以下代码。
Install-Package Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider -Version 3.0.0 Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
步骤 2:实现应用程序逻辑
应用程序将连接到其中一个教程中创建的 ContosoHR 数据库,请参阅先决条件,它将运行一个包含“SSN”列上 LIKE
谓词和“Salary”列上范围比较的查询。
将 Program.cs 文件(由 Visual Studio 生成)的内容替换为以下代码。
using System; using Microsoft.Data.SqlClient; using System.Data; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // Connection string for SQL Server string connectionString = "Data Source = myserver; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Attestation Protocol = HGS; Enclave Attestation Url = http://hgs.bastion.local/Attestation; Integrated Security = true"; // Connection string for Azure SQL Database with Intel SGX enclaves //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Attestation Protocol = AAS; Enclave Attestation Url = https://myattestationprovider.uks.attest.azure.net/attest/SgxEnclave; User ID=user; Password=password"; // Connection string for Azure SQL Database with VBS enclaves //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Attestation Protocol = None; User ID=user; Password=password"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [Salary] FROM [HR].[Employees] WHERE [SSN] LIKE @SSNPattern AND [Salary] > @MinSalary;"; SqlParameter paramSSNPattern = cmd.CreateParameter(); paramSSNPattern.ParameterName = @"@SSNPattern"; paramSSNPattern.DbType = DbType.AnsiStringFixedLength; paramSSNPattern.Direction = ParameterDirection.Input; paramSSNPattern.Value = "%9838"; paramSSNPattern.Size = 11; cmd.Parameters.Add(paramSSNPattern); SqlParameter MinSalary = cmd.CreateParameter(); MinSalary.ParameterName = @"@MinSalary"; MinSalary.DbType = DbType.Currency; MinSalary.Direction = ParameterDirection.Input; MinSalary.Value = 20000; cmd.Parameters.Add(MinSalary); cmd.ExecuteNonQuery(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader[0] + ", " + reader[1] + ", " + reader[2] + ", " + reader[3]); } Console.ReadKey(); } } } }
更新数据库连接字符串。
- 设置有效的服务器名称和数据库身份验证设置。
- 如果要对数据库使用证明,请将 enclave 证明协议设置为证明服务的正确值(主机保护者服务中为
HGS
,Microsoft Azure 证明中为AAS
)。 否则,请将 enclave 证明协议设置为None
。
生成并运行应用程序。