教學:使用具有安全記憶體保護區域的 Always Encrypted 開發 .NET 應用程式

適用於:SQL Server 2019 (15.x) 及以後版本在 Windows Azure SQL 資料庫

本教學課程將教您如何開發應用程式,以執行使用伺服器端安全記憶體保護區的資料庫查詢,供 含安全記憶體保護區的 Always Encrypted 使用。

必要條件

在依照本教學課程中的下列步驟操作之前,請先確認您已完成 使用搭配安全記憶體保護區的 Always Encrypted 快速入門 教學課程中的其中一個。

此外,您還需要 Visual Studio (建議使用版本 2022);您可以從 https://visualstudio.microsoft.com/ 進行下載。 您的應用程式開發環境必須使用 .NET Framework 4.6.1 或更新版本,或是 .NET Core 3.1 或更新版本。

步驟 1:設定 Visual Studio 專案

若要在 .NET Framework 應用程式中使用具有安全記憶體保護區的 Always Encrypted,您必須確定您的應用程式目標為 .NET Framework 4.6.1 或更新版本。 若要在 .NET Core 應用程式中搭配安全記憶體保護區使用 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 證明通訊協定設為符合您證明服務的正確值(若使用 Host Guardian Service,則為 HGS;若使用 Microsoft Azure 證明,則為 AAS)。 否則,請將安全區域認證通訊協定設定為 None
  3. 建置並執行應用程式。