Esercitazione: Sviluppare un'applicazione .NET Framework usando Always Encrypted con enclave sicuriTutorial: Develop a .NET Framework application using Always Encrypted with secure enclaves

Si applica a:Applies to: sìSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x) - Solo Windows Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL DatabaseSi applica a:Applies to: sìSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x) - Windows only Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL Database

Questa esercitazione illustra come sviluppare un'applicazione che esegue query di database che usano un'enclave sicura sul lato server per Always Encrypted con enclave sicure.This tutorial teaches you how to develop an application that issues database queries that use a server-side secure enclave for Always Encrypted with secure enclaves.

PrerequisitiPrerequisites

Assicurarsi di aver completato una delle esercitazioni riportate di seguito prima di seguire le procedure in questa esercitazione:Make sure you've completed one of the below tutorials before following the below steps in this tutorial:

Sarà necessario anche Visual Studio (versione 2019 consigliata) che può essere scaricato da https://visualstudio.microsoft.com/.You will also need Visual Studio (version 2019 is recommended) - download it from https://visualstudio.microsoft.com/. Il computer di sviluppo dell'applicazione deve eseguire.NET Framework 4.7.2 o versione successiva.Your application development machine must run .NET Framework 4.7.2 or later.

Passaggio 1: Configurare il progetto di Visual StudioStep 1: Set up your Visual Studio Project

Per usare Always Encrypted con enclave sicuri in un'applicazione .NET Framework, è necessario assicurarsi che l'applicazione sia sviluppata con .NET Framework 4.7.2 e integrata con il pacchetto NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.To use Always Encrypted with secure enclaves in a .NET Framework application, you need to make sure your application is built against .NET Framework 4.7.2 and is integrated with the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet. Inoltre, se si archivia la chiave master della colonna in Azure Key Vault, è anche necessario integrare l'applicazione con il pacchetto NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider, versione 2.2.0 o successiva.In addition, if you store you column master key in Azure Key Vault, you also need to integrate your application with the Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet, version 2.2.0 or later.

  1. Aprire Visual Studio.Open Visual Studio.

  2. Creare un nuovo progetto di app console C# (.NET Framework).Create a new C# Console App (.NET Framework) project.

  3. Assicurarsi che il progetto sia destinato almeno a .NET Framework 4.7.2.Make sure your project targets at least .NET Framework 4.7.2. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, scegliere Proprietà e impostare Framework di destinazione su.NET Framework 4.7.2.Right-click on the project in Solution Explorer, select Properties and set Target framework to .NET Framework 4.7.2.

  4. Installare il pacchetto NuGet seguente passando a Strumenti (menu principale) > Gestione pacchetti NuGet > Console di Gestione pacchetti.Install the following NuGet package by going to Tools (main menu) > NuGet Package Manager > Package Manager Console. Eseguire il codice seguente nella Console di Gestione pacchetti.Run the following code in the Package Manager Console.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
    
  5. Se si usa Azure Key Vault pe l'archiviazione delle chiavi master della colonna, installare i pacchetti NuGet seguenti passando a Strumenti (menu principale) > Gestione pacchetti NuGet > Console di Gestione pacchetti.If you use Azure Key Vault for storing your column master keys, install the following NuGet packages by going to Tools (main menu) > NuGet Package Manager > Package Manager Console. Eseguire il codice seguente nella Console di Gestione pacchetti.Run the following code in the Package Manager Console.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.2.0
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    
  6. Aprire il file App.config del progetto.Open the App.config file for your project.

  7. Individuare la sezione <configuration> e aggiungere o aggiornare le sezioni <configSections>.Locate the <configuration> section and add or update the <configSections> sections.

    1. Se la sezione <configuration> non contiene la sezione <configSections>, aggiungere il contenuto seguente immediatamente sotto <configuration>.If the <configuration> section does not contain the <configSections> section, add the following content immediately below <configuration>.

      <configSections>
        <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      
    2. Se la sezione <configuration> contiene già la sezione <configSections>, aggiungere la riga seguente all'interno della sezione <configSections>:If the <configuration> section already contains the <configSections> section, add the following line within the <configSections> section:

      <section name="SqlColumnEncryptionEnclaveProviders"  type="System.   Data.SqlClient.   SqlColumnEncryptionEnclaveProviderConfigurationSection, System.   Data,  Version=4.0.0.0, Culture=neutral,    PublicKeyToken=b77a5c561934e089" />
      
  8. Nella sezione <configuration>, sotto </configSections>, aggiungere una nuova sezione, che specifica un provider di enclave da usare per l'attestazione e l'interazione con l'enclave sicura lato server.Inside the <configuration> section, below </configSections>, add a new section, which specifies an enclave provider to be used to attest and interact with your server-side secure enclave.

    1. Se si usa SQL ServerSQL Server e il servizio Sorveglianza host (HGS) (si sta usando il database da Esercitazione: Introduzione ad Always Encrypted con enclave sicure in SQL Server), aggiungere la sezione riportata di seguito.If you're using SQL ServerSQL Server and Host Guardian Service (HGS) (you're using the database from Tutorial: Getting started with Always Encrypted with secure enclaves in SQL Server), add the below section.

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

      Di seguito è riportato un esempio completo di un file app.config per una semplice applicazione console.Here is a complete example of an app.config file for a simple console application.

      <?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. Se si usa database SQL di AzureAzure SQL Database e il servizio Attestazione di Microsoft Azure (si usa il database da Esercitazione: Introduzione ad Always Encrypted con enclave sicure nel database SQL di Azure), aggiungere la sezione riportata di seguito.If you're using database SQL di AzureAzure SQL Database and Microsoft Azure Attestation (you are using the database from Tutorial: Getting started with Always Encrypted with secure enclaves in Azure SQL Database), add the below section.

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

      Di seguito è riportato un esempio completo di un file app.config per una semplice applicazione console.Here is a complete example of an app.config file for a simple console application.

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

Passaggio 2: Implementare la logica dell'applicazioneStep 2: Implement your application logic

L'applicazione si connetterà al database ContosoHR creato in Esercitazione: Introduzione ad Always Encrypted con enclave sicure in SQL Server o Esercitazione: Introduzione ad Always Encrypted con enclave sicure nel database SQL di Azure ed eseguirà una query che contiene il predicato LIKE sulla colonna SSN e un confronto di intervalli sulla colonna Salary.Your application will connect to the ContosoHR database from Tutorial: Getting started with Always Encrypted with secure enclaves in SQL Server or Tutorial: Getting started with Always Encrypted with secure enclaves in Azure SQL Database and it will run a query that contains the LIKE predicate on the SSN column and a range comparison on the Salary column.

  1. Sostituire il contenuto del file Program.cs (generato da Visual Studio) con il codice seguente.Replace the content of the Program.cs file (generated by Visual Studio) with the below code. Aggiornare la stringa di connessione di database con il nome del server, le impostazioni di autenticazione del database e l'URL di attestazione dell'enclave per l'ambiente.Update the database connection string with your server name, database authentication settings, and the enclave attestation URL for your environment.

    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. Compilare ed eseguire l'applicazione.Build and run the application.

Vedere ancheSee Also