Tutorial: Entwickeln einer .NET Framework-Anwendung mithilfe von Always Encrypted mit Secure Enclaves

Gilt für: SQL Server 2019 (15.x) und höher – nur Windows Azure SQL-Datenbank

In diesem Tutorial erfahren Sie, wie Sie eine Anwendung entwickeln, die Datenbankabfragen ausgibt, die eine serverseitige Secure Enclave für Always Encrypted mit Secure Enclaves verwendet.

Hinweis

.NET Framework unterstützt die Verwendung von Always Encrypted with VBS-Enklaven ohne Nachweis nicht. Dieses Lernprogramm gilt nur, wenn Sie den Nachweis mit dem Microsoft Azure Attestation (mit Intel SGX-Enklaven in Azure SQL-Datenbank) oder Host-Überwachungsdienst (mit VBS-Enklaven in SQL Server) verwenden.

Voraussetzungen

Sie sollten unbedingt eines der Tutorials Erste Schritte mit Always Encrypted mit Secure Enclaves abgeschlossen haben, bevor Sie die folgenden Schritte in diesem Tutorial ausführen.

Darüber hinaus benötigen Sie Visual Studio (Version 2022 wird empfohlen). Den Download finden Sie unter https://visualstudio.microsoft.com/. Auf Ihrem Anwendungsentwicklungscomputer muss .NET Framework 4.7.2 oder höher ausgeführt werden.

Schritt 1: Einrichten Ihres Visual Studio-Projekts

Damit Sie Always Encrypted mit Secure Enclaves in einer.NET Framework-Anwendung verwenden können, müssen Sie sicherstellen, dass Ihre Anwendung auf .NET Framework 4.7.2 basiert und mit dem Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders-NuGet-Paket integriert ist. Wenn Sie Ihren Spaltenhauptschlüssel in Azure Key Vault speichern, müssen Sie Ihre Anwendung außerdem in Version 2.4.0 oder höher des Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider-NuGet-Pakets integrieren.

  1. Öffnen Sie Visual Studio.

  2. Erstellen Sie ein neues C#-Konsolen-App-Projekt (.NET Framework).

  3. Stellen Sie sicher, dass das Projekt mindestens auf .NET Framework 4.7.2 ausgerichtet ist. Klicken Sie mit der rechten Maustaste auf das Projekt im Projektmappen-Explorer, wählen Sie Eigenschaften aus und legen Sie das Zielframework auf .NET Framework 4.7.2 fest.

  4. Installieren Sie das folgende NuGet-Paket, indem Sie zu Tools (Hauptmenü) >NuGet-Paket-Manager>Paket-Manager-Konsole navigieren. Führen Sie den folgenden Code in der Paket-Manager-Konsole aus.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
    
  5. Wenn Sie Azure Key Vault für die Speicherung Ihrer Spaltenhauptschlüssel verwenden, installieren Sie die folgenden NuGet-Pakete, indem Sie zu Tools (Hauptmenü) >NuGet-Paket-Manager>Paket-Manager-Konsole navigieren. Führen Sie den folgenden Code in der Paket-Manager-Konsole aus.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    
  6. Öffnen Sie die Datei „App.config“ für Ihr Projekt.

  7. Suchen Sie nach dem Abschnitt <configuration>, und führen Sie die <configSections>-Abschnitte hinzu oder aktualisieren Sie diese.

    1. Wenn der Abschnitt <configuration> nicht den Abschnitt <configSections> enthält, fügen Sie den folgenden Inhalt direkt unter <configuration> hinzu.

      <configSections>
        <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      
    2. Wenn der Abschnitt <configuration> den Abschnitt <configSections> bereits enthält, fügen Sie die folgende Zeile im <configSections>-Abschnitt hinzu:

      <section name="SqlColumnEncryptionEnclaveProviders"  type="System.   Data.SqlClient.   SqlColumnEncryptionEnclaveProviderConfigurationSection, System.   Data,  Version=4.0.0.0, Culture=neutral,    PublicKeyToken=b77a5c561934e089" />
      
  8. Fügen Sie im Abschnitt <configuration> unter </configSections> einen neuen Abschnitt hinzu, um einen Enclave-Anbieter festzulegen, der für die Bestätigung und Interaktion mit Ihren serverseitigen sicheren Enclaves verwendet werden soll.

    1. Wenn Sie SQL Server und den Host-Überwachungsdienst (Host Guardian Service, HGS) verwenden (Sie verwenden die Datenbank aus Tutorial: Erste Schritte mit Always Encrypted mit Secure Enclaves in SQL Server), fügen Sie den folgenden Abschnitt hinzu.

      <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>
      

      Hier ist ein vollständiges Beispiel für eine app.config-Datei für eine einfache Konsolenanwendung.

      <?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. Wenn Sie Azure SQL-Datenbank mit SGX-Enklaven und Microsoft Azure Attestation verwenden (Sie verwenden die Datenbank aus Tutorial: Erste Schritte mit sicheren Intel SGX-Enklaven in Azure SQL-Datenbank), fügen Sie den folgenden Abschnitt hinzu.

      <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>
      

      Hier ist ein vollständiges Beispiel für eine app.config-Datei für eine einfache Konsolenanwendung.

      <?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>
      

Schritt 2: Implementieren Ihrer Anwendungslogik

Ihre Anwendung stellt eine Verbindung mit der Datenbank ContosoHR her, die in einem der Tutorials erstellt wurde (siehe Voraussetzungen), und führt eine Abfrage aus, die das Prädikat LIKE in der Spalte SSN sowie einen Bereichsvergleich in der Spalte Salary enthält.

  1. Ersetzen Sie mit dem folgenden Code den Inhalt der Datei „Program.cs“ (wird von Visual Studio generiert). Aktualisieren Sie die Datenverbindungszeichenfolge mit Ihrem Servernamen, den Einstellungen zur Datenbankauthentifizierung und die Enclave-Nachweis-URL für Ihre Umgebung.

    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. Erstellen Sie die Anwendung, und führen Sie sie aus.

Weitere Informationen