教程:使用具有安全 enclave 的 Always Encrypted 开发 .NET 应用程序

适用于: SQL Server 2019 (15.x) 及更高版本 - 仅限 Windows Azure SQL 数据库

适用于: .NET Framework .NET Core Not supported. .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 集成。

  1. 打开 Visual Studio。

  2. 新建 C# 控制台应用 (.NET Framework/Core) 项目。

  3. 请确保项目至少面向 .NET Framework 4.6 或 .NET Core 3.1。 在“解决方案资源管理器”中右键单击项目,选择“属性”,然后设置目标框架。

  4. 通过转到“工具”(主菜单)>“NuGet 包管理器”>“包管理器控制台”安装以下 NuGet 包。 在“包管理器控制台”中运行以下代码。

    Install-Package Microsoft.Data.SqlClient -Version 5.0.1
    
  5. 如果使用 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”列上范围比较的查询。

  1. 将 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();
                }
            }
        }
    }
    
  2. 更新数据库连接字符串。

    1. 设置有效的服务器名称和数据库身份验证设置。
    2. 如果要对数据库使用证明,请将 enclave 证明协议设置为证明服务的正确值(主机保护者服务中为 HGS,Microsoft Azure 证明中为 AAS)。 否则,请将 enclave 证明协议设置为 None
  3. 生成并运行应用程序。

另请参阅