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

適用於:SQL Server 2019 (15.x) 及更新版本 - 僅限 WindowsAzure SQL Database

適用於: .NET Framework .NET Core Not supported. .NET Standard

本教學課程會教您如何開發應用程式來發出資料庫查詢,其針對具有安全記憶體保護區的 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。 以滑鼠右鍵按一下 [方案總管] 中的專案、選取 [屬性],然後設定目標 Framework。

  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. 如果您使用資料庫的證明,請將記憶體保護區證明通訊協定設定為證明服務的正確值 (針對主機守護者服務為 HGS 或針對 Microsoft Azure 證明為 AAS)。 否則,請將記憶體保護區證明通訊協定設定為 None
  3. 建置並執行應用程式。

另請參閱