Självstudie: Utveckla ett .NET Framework-program med Always Encrypted med säkra enklaver

Gäller för: SQL Server 2019 (15.x) och senare versioner i Windows Azure SQL Database

I den här självstudien lär du dig hur du utvecklar ett program som utfärdar databasfrågor som använder en säker enklav på serversidan för Always Encrypted med säkra enklaver.

Anmärkning

.NET Framework stöder inte användning av Always Encrypted med VBS-enklaver utan attestering. Den här handledningen gäller endast om du använder attestering med Microsoft Azure Attestation (med Intel SGX-enklaver i Azure SQL Database) eller Host Guardian Service (med VBS-enklaver i SQL Server).

Förutsättningar

Kontrollera att du har slutfört en av handledningarna i Komma igång med Always Encrypted med säkra enklaver, så att du kan avancera till nästa steg nedan i denna handledning.

Du behöver också Visual Studio (version 2022 rekommenderas) – ladda ned det från https://visualstudio.microsoft.com/. Programutvecklingsdatorn måste köra .NET Framework 4.7.2 eller senare.

Steg 1: Konfigurera ditt Visual Studio-projekt

Om du vill använda Always Encrypted med säkra enklaver i ett .NET Framework-program måste du se till att ditt program är byggt mot .NET Framework 4.7.2 och är integrerat med Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet. Om du lagrar din kolumnhuvudnyckel i Azure Key Vault måste du också integrera ditt program med Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet, version 2.4.0 eller senare.

  1. Öppna Visual Studio.

  2. Skapa ett nytt C#-konsolappsprojekt (.NET Framework).

  3. Kontrollera att projektet har minst .NET Framework 4.7.2 som mål. Högerklicka på projektet i Solution Explorer, välj Egenskaper och ange Målramverk till .NET Framework 4.7.2.

  4. Installera följande NuGet-paket genom att gå till Verktyg (huvudmenyn) >NuGet Package Manager>Package Manager Console. Kör följande kod i Package Manager-konsolen.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
    
  5. Om du använder Azure Key Vault för att lagra dina kolumnhuvudnycklar installerar du följande NuGet-paket genom att gå till Verktyg (huvudmenyn) >NuGet Package Manager>Package Manager Console. Kör följande kod i Package Manager-konsolen.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    
  6. Öppna filen App.config för projektet.

  7. Leta upp avsnittet <configuration> och lägg till eller uppdatera avsnitten <configSections> .

    1. Om avsnittet <configuration>inte innehåller <configSections> avsnittet lägger du till följande innehåll direkt under <configuration>.

      <configSections>
        <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      
    2. Om avsnittet <configuration> redan innehåller <configSections> avsnittet lägger du till följande rad i avsnittet <configSections> :

      <section name="SqlColumnEncryptionEnclaveProviders"  type="System.   Data.SqlClient.   SqlColumnEncryptionEnclaveProviderConfigurationSection, System.   Data,  Version=4.0.0.0, Culture=neutral,    PublicKeyToken=b77a5c561934e089" />
      
  8. I avsnittet <configuration> nedan </configSections>lägger du till ett nytt avsnitt som anger en enklavprovider som ska användas för att intyga och interagera med din säkra enklaver på serversidan.

    1. Om du använder SQL Server och Host Guardian Service (HGS) (du använder databasen från Självstudie: Komma igång med Always Encrypted med säkra enklaver i SQL Server) lägger du till avsnittet nedan.

      <SqlColumnEncryptionEnclaveProviders>
        <providers>
          <add name="VBS"  type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider,  Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders,    Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        </providers>
      </SqlColumnEncryptionEnclaveProviders>
      

      Här är ett fullständigt exempel på en app.config fil för ett enkelt konsolprogram.

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <configSections>
          <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </configSections>
        <SqlColumnEncryptionEnclaveProviders>
          <providers>
            <add name="VBS"  type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider,  Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders,    Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
          </providers>
        </SqlColumnEncryptionEnclaveProviders>
        <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
        </startup>
      </configuration>
      
    2. Om du använder Azure SQL Database med SGX-enklaver och Microsoft Azure Attestation (du använder databasen från Självstudie: Komma igång med Always Encrypted med säkra Intel SGX-enklaver i Azure SQL Database) lägger du till avsnittet nedan.

      <SqlColumnEncryptionEnclaveProviders>
        <providers>
          <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </providers>
      </SqlColumnEncryptionEnclaveProviders>
      

      Här är ett fullständigt exempel på en app.config fil för ett enkelt konsolprogram.

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <configSections>
          <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </configSections>
        <SqlColumnEncryptionEnclaveProviders>
          <providers>
            <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
          </providers>
        </SqlColumnEncryptionEnclaveProviders>
        <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
        </startup>
      </configuration>
      

Steg 2: Implementera din programlogik

Ditt program ansluter till ContosoHR-databasen som skapades i någon av självstudierna, se Förutsättningar och den kör en fråga som innehåller predikatet LIKE i SSN-kolumnen och en intervalljämförelse i kolumnen Lön .

  1. Ersätt innehållet i Program.cs -filen (genereras av Visual Studio) med koden nedan. Uppdatera databasanslutningssträngen med servernamnet, autentiseringsinställningarna för databasen och url:en för enklavattestering för din miljö.

    using System;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                string connectionString = "Data Source = myserver; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = http://hgs.bastion.local/Attestation; Integrated Security = true";
    
                //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = https://myattestationprovider.uks.attest.azure.net/attest/SgxEnclave; 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. Skapa och kör programmet.

Se även