Delen via


Always Encrypted gebruiken met de .NET Framework-gegevensprovider voor SQL Server

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Dit artikel bevat informatie over het ontwikkelen van .NET Framework-toepassingen met Always Encrypted of Always Encrypted met beveiligde enclaves en de .NET Framework-gegevensprovider voor SQL Server (System.Data.SqlClient).

Opmerking

Het gebruik van de .NET Framework-gegevensprovider voor SQL Server (System.Data.SqlClient) wordt niet aanbevolen voor nieuwe ontwikkeling. Zie System.Data.SqlClient voor meer informatie.

Met Always Encrypted kunnen clienttoepassingen gevoelige gegevens versleutelen en nooit de gegevens of de versleutelingssleutels onthullen aan SQL Server of Azure SQL Database. Een always encrypted-stuurprogramma, zoals de .NET Framework-gegevensprovider voor SQL Server, bereikt dit door gevoelige gegevens in de clienttoepassing transparant te versleutelen en ontsleutelen. Het stuurprogramma bepaalt automatisch welke queryparameters overeenkomen met gevoelige databasekolommen (beveiligd met Always Encrypted) en versleutelt de waarden van deze parameters voordat de gegevens worden doorgegeven aan SQL Server of Azure SQL Database. Op dezelfde manier ontsleutelt de driver transparant gegevens die zijn opgehaald uit versleutelde databasekolommen in queryresultaten. Zie Toepassingen ontwikkelen met Always Encrypted en Toepassingen ontwikkelen met Always Encrypted met beveiligde enclaves voor meer informatie.

Opmerking

.NET Framework Data Provider voor SQL Server (System.Data.SqlClient) biedt geen ondersteuning voor het gebruik van VBS-enclaves zonder attestation.

Vereiste voorwaarden

Opmerking

Het ondersteuningsniveau voor Always Encrypted in bepaalde versies van .NET Framework varieert. Always Encrypted API-verwijzingen worden vermeld in de volgende secties.

Always Encrypted inschakelen voor toepassingsquery's

De eenvoudigste manier om de versleuteling van parameters in te schakelen en de ontsleuteling van queryresultaten die gericht zijn op de versleutelde kolommen, is door de waarde van het trefwoord kolomversleutelingsinstelling in te stellen op ingeschakeld.

Hier volgt een voorbeeld van een verbindingsreeks die Always Encrypted inschakelt:

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
SqlConnection connection = new SqlConnection(connectionString);

Hier volgt een equivalent voorbeeld met behulp van de eigenschap SqlConnectionStringBuilder.ColumnEncryptionSetting.

SqlConnectionStringBuilder strbldr = new SqlConnectionStringBuilder();
strbldr.DataSource = "server63";
strbldr.InitialCatalog = "Clinic";
strbldr.IntegratedSecurity = true;
strbldr.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
SqlConnection connection = new SqlConnection(strbldr.ConnectionString);

Always Encrypted kan ook worden ingeschakeld voor afzonderlijke query's. Zie de sectie Prestaties beheren van Always Encrypted hieronder. Het inschakelen van Always Encrypted is niet voldoende om versleuteling of ontsleuteling te voltooien. U moet er ook voor zorgen dat:

  • De toepassing heeft de databasemachtigingen ELKE KOLOMHOOFDSLEUTELDEFINITIE WEERGEVEN en ELKE KOLOMVERSLEUTELINGSSLEUTELDEFINITIE WEERGEVEN, die vereist zijn voor toegang tot de metagegevens over Always Encrypted-sleutels in de database. Zie de sectie Machtigingen in Always Encrypted (Database Engine) voor meer informatie.
  • De toepassing heeft toegang tot de kolomhoofdsleutel die de kolomversleutelingssleutels beveiligt en de kolommen van de querydatabase versleutelt.

Always Encrypted inschakelen met beveiligde enclaves

Vanaf .NET Framework versie 4.7.2 ondersteunt het stuurprogramma Always Encrypted met beveiligde enclaves.

Zie Toepassingen ontwikkelen met Always Encrypted met beveiligde enclaves voor algemene informatie over de rol van clientstuurprogramma in enclaveberekeningen en enclave-attestation.

Uw toepassing configureren:

  1. Schakel Always Encrypted in voor uw toepassingsquery's, zoals wordt uitgelegd in de vorige sectie.

  2. Integreer het NuGet-pakket Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders met uw toepassing. De NuGet is een bibliotheek met enclaveproviders, waarbij de logica aan de clientzijde wordt geïmplementeerd voor attestation-protocollen en voor het tot stand brengen van een beveiligd kanaal met een beveiligde enclave.

  3. Werk de toepassingsconfiguratie (bijvoorbeeld in web.config of app.config) bij om de toewijzing te definiëren tussen een enclavetype, geconfigureerd voor uw database en een enclaveprovider.

    1. Als u SQL Server en Host Guardian Service (HGS) gebruikt, moet u het VBS-enclavetype koppelen aan de Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider klasse van het NuGet-pakket.
    2. Als u Azure SQL Database en Microsoft Azure Attestation gebruikt, moet u het SGX-enclavetype toewijzen aan de klasse Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider uit het NuGet-pakket.

    Zie Zelfstudie: Een .NET Framework-toepassing ontwikkelen met Always Encrypted met beveiligde enclaves voor gedetailleerde instructies voor het bewerken van uw toepassingsconfiguratie.

  4. Stel het trefwoord Enclave Attestation URL in de verbindingsreeks van uw database in op een attestation-URL (een eindpunt van de attestation-service). U moet een attestation-URL voor uw omgeving verkrijgen van uw attestation-servicebeheerder.

    1. Als u SQL Server en Host Guardian Service (HGS) gebruikt, raadpleegt u De HGS-attestation-URL bepalen en delen.
    2. Als u Azure SQL Database en Microsoft Azure Attestation gebruikt, raadpleegt u De attestation-URL voor uw attestation-beleid bepalen.

Zie zelfstudie: Een .NET Framework-toepassing ontwikkelen met Always Encrypted met beveiligde enclaves voor een stapsgewijze zelfstudie

Gegevens ophalen en wijzigen in versleutelde kolommen

Zodra u Always Encrypted hebt ingeschakeld voor toepassingsquery's, kunt u standard ADO.NET API's gebruiken (zie Gegevens ophalen en wijzigen in ADO.NET) of de .NET Framework-gegevensprovider voor SQL Server-API's , gedefinieerd in de System.Data.SqlClient-naamruimte, om gegevens op te halen of te wijzigen in versleutelde databasekolommen. Ervan uitgaande dat uw toepassing de vereiste databasemachtigingen heeft en toegang heeft tot de hoofdsleutel van de kolom, versleutelt de .NET Framework-gegevensprovider voor SQL Server alle queryparameters die zijn gericht op versleutelde kolommen en ontsleutelt de gegevens die zijn opgehaald uit versleutelde kolommen en retourneert deze waarden van .NET-typen die overeenkomen met de SQL Server-gegevenstypen die zijn ingesteld voor de kolommen in het databaseschema. Als Always Encrypted niet is ingeschakeld, mislukken query's met parameters die zijn gericht op versleutelde kolommen. Query's kunnen nog steeds gegevens ophalen uit versleutelde kolommen, zolang de query geen parameters heeft die zijn gericht op versleutelde kolommen. De .NET Framework-gegevensprovider voor SQL Server probeert echter geen waarden te ontsleutelen die zijn opgehaald uit versleutelde kolommen en de toepassing ontvangt binaire versleutelde gegevens (als bytematrices).

De onderstaande tabel bevat een overzicht van het gedrag van query's, afhankelijk van of Always Encrypted is ingeschakeld of niet:

Querykenmerk Always Encrypted is ingeschakeld en de toepassing heeft toegang tot de sleutels en sleutelmetagegevens Always Encrypted is ingeschakeld en de toepassing heeft geen toegang tot de sleutels of sleutelmetagegevens Always Encrypted is uitgeschakeld
Query's met parameters die zijn gericht op versleutelde kolommen. Parameterwaarden worden transparant versleuteld. Fout Fout
Query's die gegevens ophalen uit versleutelde kolommen, zonder parameters die zijn gericht op versleutelde kolommen. Resultaten van versleutelde kolommen worden transparant ontsleuteld. De toepassing ontvangt waarden voor tekst zonder opmaak van de .NET-gegevenstypen die overeenkomen met de SQL Server-typen die zijn geconfigureerd voor de versleutelde kolommen. Fout Resultaten van versleutelde kolommen worden niet ontsleuteld. De toepassing ontvangt versleutelde waarden als bytematrices (byte[]).

De volgende voorbeelden illustreren het ophalen en wijzigen van gegevens in versleutelde kolommen. In de voorbeelden wordt verondersteld dat de doeltabel het onderstaande schema heeft. De kolommen SSN en BirthDate zijn versleuteld.

CREATE TABLE [dbo].[Patients]([PatientId] [int] IDENTITY(1,1), 
 [SSN] [char](11) COLLATE Latin1_General_BIN2 
 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC, 
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
 [FirstName] [nvarchar](50) NULL,
 [LastName] [nvarchar](50) NULL, 
 [BirthDate] [date] 
 ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED, 
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL
 PRIMARY KEY CLUSTERED ([PatientId] ASC) ON [PRIMARY])
 GO

Voorbeeld van het invoegen van gegevens

In dit voorbeeld wordt een rij ingevoegd in de tabel Patiënten. Let op het volgende:

  • Er is niets specifieks voor versleuteling in de voorbeeldcode. De .NET Framework-gegevensprovider voor SQL Server detecteert en versleutelt automatisch de parameters paramSSN en paramBirthdate die zijn gericht op versleutelde kolommen. Dit maakt versleuteling transparant voor de toepassing.
  • De waarden die zijn ingevoegd in databasekolommen, inclusief de versleutelde kolommen, worden doorgegeven als SqlParameter-objecten . Hoewel het gebruik van SqlParameter optioneel is bij het verzenden van waarden naar niet-versleutelde kolommen (hoewel het ten zeerste wordt aanbevolen omdat sql-injectie wordt voorkomen), is het vereist voor waarden die zijn gericht op versleutelde kolommen. Als de waarden die zijn ingevoegd in de kolommen SSN of BirthDate zijn doorgegeven als letterlijke waarden die zijn ingesloten in de query-instructie, mislukt de query omdat de .NET Framework-gegevensprovider voor SQL Server de waarden in de versleutelde doelkolommen niet kan bepalen, zodat de waarden niet worden versleuteld. Als gevolg hiervan weigert de server deze als niet compatibel met de versleutelde kolommen.
  • Het gegevenstype van de parameter die is gericht op de SSN-kolom, is ingesteld op een ANSI-tekenreeks (niet-Unicode), die is toegewezen aan het gegevenstype char/varchar SQL Server. Als het type van de parameter is ingesteld op een Unicode-tekenreeks (String), die wordt toegewezen aan nchar/nvarchar, mislukt de query omdat Always Encrypted geen ondersteuning biedt voor conversies van versleutelde nchar/nvarchar-waarden naar versleutelde char/varchar-waarden. Zie SQL Server Gegevenstype-toewijzingen voor meer informatie over gegevenstype-toewijzingen.
  • Het gegevenstype van de parameter die in de kolom BirthDate is ingevoegd, wordt expliciet ingesteld op het gegevenstype SQL Server met behulp van de eigenschap SqlParameter.SqlDbType, in plaats van te vertrouwen op de impliciete toewijzing van .NET-typen aan SQL Server-gegevenstypen die worden toegepast bij het gebruik van de eigenschap SqlParameter.DbType. DateTime-structuur wordt standaard toegewezen aan het gegevenstype datetime SQL Server. Omdat het gegevenstype van de kolom Geboortedatum datum is en Always Encrypted geen ondersteuning biedt voor een conversie van versleutelde datum/tijd-waarden naar versleutelde datumwaarden, resulteert het gebruik van de standaardtoewijzing in een fout.
string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
using (SqlConnection connection = new SqlConnection(strbldr.ConnectionString))
{
   using (SqlCommand cmd = connection.CreateCommand())
   {
      cmd.CommandText = @"INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (@SSN, @FirstName, @LastName, @BirthDate);";

      SqlParameter paramSSN = cmd.CreateParameter();
      paramSSN.ParameterName = @"@SSN";
      paramSSN.DbType = DbType.AnsiStringFixedLength;
      paramSSN.Direction = ParameterDirection.Input;
      paramSSN.Value = "795-73-9838";
      paramSSN.Size = 11;
      cmd.Parameters.Add(paramSSN);

      SqlParameter paramFirstName = cmd.CreateParameter();
      paramFirstName.ParameterName = @"@FirstName";
      paramFirstName.DbType = DbType.String;
      paramFirstName.Direction = ParameterDirection.Input;
      paramFirstName.Value = "Catherine";
      paramFirstName.Size = 50;
      cmd.Parameters.Add(paramFirstName);

      SqlParameter paramLastName = cmd.CreateParameter();
      paramLastName.ParameterName = @"@LastName";
      paramLastName.DbType = DbType.String;
      paramLastName.Direction = ParameterDirection.Input;
      paramLastName.Value = "Abel";
      paramLastName.Size = 50;
      cmd.Parameters.Add(paramLastName);

      SqlParameter paramBirthdate = cmd.CreateParameter();
      paramBirthdate.ParameterName = @"@BirthDate";
      paramBirthdate.SqlDbType = SqlDbType.Date;
      paramBirthdate.Direction = ParameterDirection.Input;
      paramBirthdate.Value = new DateTime(1996, 09, 10);
      cmd.Parameters.Add(paramBirthdate);

      cmd.ExecuteNonQuery();
   } 
}

Voorbeeld van het ophalen van platte tekstgegevens

In het volgende voorbeeld wordt gedemonstreerd hoe u gegevens kunt filteren op basis van versleutelde waarden en platte tekstgegevens kunt ophalen uit versleutelde kolommen. Let op het volgende:

  • De waarde die wordt gebruikt in de WHERE-component om te filteren op de SSN-kolom moet worden doorgegeven met behulp van SqlParameter, zodat de .NET Framework-gegevensprovider voor SQL Server deze transparant kan versleutelen voordat deze naar de database wordt verzonden.
  • Alle waarden die door het programma worden afgedrukt, worden in tekst zonder opmaak weergegeven, omdat de .NET Framework-gegevensprovider voor SQL Server de gegevens die zijn opgehaald uit de kolommen SSN en BirthDate transparant ontsleutelen.

Opmerking

Query's kunnen gelijkheidsvergelijkingen uitvoeren voor kolommen als ze zijn versleuteld met behulp van deterministische versleuteling. Zie Deterministische of gerandomiseerde versleuteling selecteren voor meer informatie.

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
    
using (SqlConnection connection = new SqlConnection(strbldr.ConnectionString))
 {
    using (SqlCommand cmd = connection.CreateCommand())
 {

 cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN=@SSN";
 SqlParameter paramSSN = cmd.CreateParameter();
 paramSSN.ParameterName = @"@SSN";
 paramSSN.DbType = DbType.AnsiStringFixedLength;
 paramSSN.Direction = ParameterDirection.Input;
 paramSSN.Value = "795-73-9838";
 paramSSN.Size = 11;
 cmd.Parameters.Add(paramSSN);
 using (SqlDataReader reader = cmd.ExecuteReader())
 {
   if (reader.HasRows)
 {
 while (reader.Read())
 {
    Console.WriteLine(@"{0}, {1}, {2}, {3}", reader[0], reader[1], reader[2], ((DateTime)reader[3]).ToShortDateString());
 }

Voorbeeld van versleutelde gegevens ophalen

Als Always Encrypted niet is ingeschakeld, kan een query nog steeds gegevens ophalen uit versleutelde kolommen, zolang de query geen parameters heeft die zijn gericht op versleutelde kolommen.

In het volgende voorbeeld ziet u hoe u binaire versleutelde gegevens ophaalt uit versleutelde kolommen. Let op het volgende:

  • Omdat Always Encrypted niet is ingeschakeld in de verbindingsreeks, retourneert de query versleutelde waarden van SSN en BirthDate als bytematrix (het programma converteert de waarden naar tekenreeksen).
  • Een query die gegevens opvraagt uit versleutelde kolommen waarvoor Always Encrypted is uitgeschakeld, kan parameters bevatten, zolang geen van de parameters zich richt op een versleutelde kolom. De bovenstaande query filtert op LastName, die niet is versleuteld in de database. Als de query wordt gefilterd op SSN of BirthDate, mislukt de query.
string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
                
using (SqlConnection connection = new SqlConnection(connectionString))
{
   connection.Open();
   using (SqlCommand cmd = connection.CreateCommand())
   {
      cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName]=@LastName";
      SqlParameter paramLastName = cmd.CreateParameter();
      paramLastName.ParameterName = @"@LastName";
      paramLastName.DbType = DbType.String;
      paramLastName.Direction = ParameterDirection.Input;
      paramLastName.Value = "Abel";
      paramLastName.Size = 50;
      cmd.Parameters.Add(paramLastName);
      using (SqlDataReader reader = cmd.ExecuteReader())
      {
         if (reader.HasRows)
         {
            while (reader.Read())
         {
         Console.WriteLine(@"{0}, {1}, {2}, {3}", BitConverter.ToString((byte[])reader[0]), reader[1], reader[2], BitConverter.ToString((byte[])reader[3]));
      }
   }
}

Het voorkomen van veelvoorkomende problemen bij het uitvoeren van query's op versleutelde kolommen

In deze sectie worden veelvoorkomende foutencategorieën beschreven bij het uitvoeren van query's op versleutelde kolommen vanuit .NET-toepassingen en een paar richtlijnen voor het voorkomen van deze kolommen.

Fouten bij het converteren van niet-ondersteunde gegevenstypen

Always Encrypted ondersteunt enkele conversies voor versleutelde gegevenstypen. Zie Always Encrypted voor een gedetailleerde lijst met ondersteunde typeconversies. Ga als volgt te werk om conversiefouten van gegevenstypen te voorkomen:

  • Stel de typen parameters in die gericht zijn op versleutelde kolommen, dus het gegevenstype SQL Server van de parameter is exact hetzelfde als het type doelkolom, of een conversie van het SQL Server-gegevenstype van de parameter naar het doeltype van de kolom wordt ondersteund. U kunt de gewenste toewijzing van .NET-gegevenstypen afdwingen voor specifieke SQL Server-gegevenstypen met behulp van de eigenschap SqlParameter.SqlDbType.
  • Controleer of de precisie en schaal van parameters die zijn gericht op kolommen van de decimale en numerieke SQL Server-gegevenstypen hetzelfde zijn als de precisie en schaal die zijn geconfigureerd voor de doelkolom.
  • Controleer of de precisie van parameters die zijn gericht op kolommen datetime2, datetimeoffset of time SQL Server-gegevenstypen niet groter zijn dan de precisie voor de doelkolom (in query's waarmee waarden in de doelkolom worden gewijzigd).

Fouten vanwege het doorgeven van tekst zonder opmaak in plaats van versleutelde waarden

Elke waarde die is gericht op een versleutelde kolom, moet in de toepassing worden versleuteld. Een poging om een tekst zonder opmaak in te voegen/te wijzigen of te filteren op een versleutelde kolom resulteert in een fout die er ongeveer als volgt uit ziet:

System.Data.SqlClient.SqlException (0x80131904): Operand type clash: varchar is incompatible with varchar(8000) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'Clinic') collation_name = 'SQL_Latin1_General_CP1_CI_AS'

Om dergelijke fouten te voorkomen, moet u het volgende controleren:

  • Always Encrypted is ingeschakeld voor toepassingsquery's die gericht zijn op versleutelde kolommen (voor de verbindingsreeks of in het SqlCommand-object voor een specifieke query).
  • U gebruikt SqlParameter om gegevens te verzenden die zijn gericht op versleutelde kolommen. In het volgende voorbeeld ziet u een query die onjuist filtert op een letterlijke/constante op een versleutelde kolom (SSN) (in plaats van de letterlijke waarde in een SqlParameter-object door te geven).
using (SqlCommand cmd = connection.CreateCommand())
{
   cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
cmd.ExecuteNonQuery();
}

Werken met opslagplaatsen voor kolom hoofdsleutels

Als u een parameterwaarde wilt versleutelen of gegevens wilt ontsleutelen in queryresultaten, moet de .NET Framework-gegevensprovider voor SQL Server een kolomversleutelingssleutel verkrijgen die is geconfigureerd voor de doelkolom. Kolom-encryptiesleutels worden in versleutelde vorm opgeslagen in de metagegevens van de database. Elke kolomversleutelingssleutel heeft een bijbehorende kolomhoofdsleutel die is gebruikt voor het versleutelen van de kolomversleutelingssleutel. De metagegevens van de database slaan de kolomhoofdsleutels niet op en bevatten alleen de informatie over een sleutelarchief met een bepaalde kolomhoofdsleutel en de locatie van de sleutel in het sleutelarchief.

Als u een platte tekst waarde van een kolom-encryptiesleutel wilt verkrijgen, verkrijgt de .NET Framework Data Provider for SQL Server eerst de metagegevens over zowel de kolom-encryptiesleutel als de bijbehorende kolommasterkey. Vervolgens worden de gegevens in de metagegevens gebruikt om contact op te nemen met het sleutelarchief, waarin de kolommasterkey is opgeslagen, en om de versleutelde kolom-encryptiesleutel te ontsleutelen. De .NET Framework-gegevensprovider voor SQL Server communiceert met een sleutelarchief met behulp van een hoofdsleutelarchiefprovider voor kolommen. Dit is een exemplaar van een klasse die is afgeleid van de klasse SqlColumnEncryptionKeyStoreProvider.

Het proces voor het verkrijgen van een kolomversleutelingssleutel:

  1. Als Always Encrypted is ingeschakeld voor een query, roept de .NET Framework-gegevensprovider voor SQL Server transparant sys.sp_describe_parameter_encryption aan om versleutelingsmetagegevens op te halen voor parameters die zijn gericht op versleutelde kolommen, als de query parameters heeft. Voor versleutelde gegevens in de resultaten van een query voegt SQL Server automatisch versleutelingsmetagegevens toe. De informatie over de hoofdsleutel van de kolom bevat:

    • De naam van een sleutelarchiefprovider die een sleutelarchief inkapselt met de kolomhoofdsleutel.
    • Het sleutelpad dat de locatie van de kolomhoofdsleutel in het sleutelarchief aangeeft.

    De informatie over de kolomversleutelingssleutel omvat:

    • De versleutelde waarde van een kolomversleutelingssleutel.
    • De naam van het algoritme dat is gebruikt voor het versleutelen van de kolomversleutelingssleutel.
  2. De .NET Framework-gegevensprovider voor SQL Server gebruikt de naam van de provider van het hoofdsleutelarchief van de kolom om het providerobject op te zoeken (een exemplaar van een klasse die is afgeleid van SqlColumnEncryptionKeyStoreProvider Class) in een interne gegevensstructuur.

  3. De .NET Framework-gegevensprovider voor SQL Server roept de SqlColumnEncryptionKeyStoreProvider.DecryptColumnEncryptionKey Methode aan, waarbij het pad van de kolomhoofdsleutel, de geëncrypteerde waarde van de kolomversleutelingssleutel en de naam van het encryptie-algoritme worden doorgegeven, die gebruikt is om de geëncrypteerde kolomversleutelingssleutel te produceren.

Ingebouwde sleutelarchiefproviders voor kolommen gebruiken

De .NET Framework-gegevensprovider voor SQL Server wordt geleverd met de volgende ingebouwde hoofdsleutelarchiefproviders voor kolommen, die vooraf zijn geregistreerd bij de specifieke providernamen (gebruikt om de provider op te zoeken).

Class Description Providernaam (opzoeknaam)
Klasse SqlColumnEncryptionCertificateStoreProvider Een provider voor de Windows-certificaatopslag. MSSQL_CERTIFICATE_STORE
SqlColumnEncryptionCngProvider Klasse

Opmerking: deze provider is beschikbaar in .NET Framework 4.6.1 en nieuwere versies.
Een provider voor een sleutelarchief dat ondersteuning biedt voor Microsoft Cryptography API: Next Generation (CNG) API. Normaal gesproken is een opslag van dit type een hardwarebeveiligingsmodule: een fysiek apparaat dat digitale sleutels beschermt en beheert en cryptoverwerking biedt. MSSQL_CNG_STORE
Klasse SqlColumnEncryptionCspProvider

Opmerking: deze provider is beschikbaar in .NET Framework 4.6.1 of hoger.
Een provider voor een sleutelarchief dat ondersteuning biedt voor Microsoft Cryptography API (CAPI). Normaal gesproken is een opslag van dit type een hardwarebeveiligingsmodule: een fysiek apparaat dat digitale sleutels beschermt en beheert en cryptoverwerking biedt. MSSQL_CSP_PROVIDER

U hoeft geen wijzigingen in de toepassingscode aan te brengen om deze providers te gebruiken, maar let op het volgende:

  • U (of uw DBA) moet ervoor zorgen dat de providernaam, die is geconfigureerd in de metagegevens van de kolomhoofdsleutel, juist is en het pad naar de hoofdsleutel van de kolom voldoet aan de indeling van het sleutelpad die geldig is voor een bepaalde provider. Het is raadzaam dat u de sleutels configureert met behulp van hulpprogramma's zoals SQL Server Management Studio, waarmee automatisch de geldige providernamen en sleutelpaden worden gegenereerd bij het uitgeven van de instructie CREATE COLUMN MASTER KEY (Transact-SQL). Voor meer informatie, zie Always Encrypted configureren met behulp van SQL Server Management Studio en Always Encrypted configureren met behulp van PowerShell.
  • Zorg ervoor dat uw toepassing toegang heeft tot de sleutel in het sleutelarchief. Dit kan inhouden dat u uw applicatie toegang geeft tot de sleutel en/of de sleutelopslag, afhankelijk van de sleutelopslag, of dat u andere sleutelopslag-specifieke configuratiestappen uitvoert. Als u bijvoorbeeld toegang wilt krijgen tot een sleutelarchief dat CNG of CAPI implementeert (bijvoorbeeld een hardwarebeveiligingsmodule), moet u ervoor zorgen dat een bibliotheek die CNG of CAPI voor uw winkel implementeert, is geïnstalleerd op uw toepassingscomputer. Zie Kolomhoofdsleutels maken en opslaan voor Always Encrypted-voor meer informatie.

Azure Key Vault-provider gebruiken

Azure Key Vault is een handige optie voor het opslaan en beheren van kolomhoofdsleutels voor Always Encrypted (met name als uw toepassingen worden gehost in Azure). De .NET Framework-gegevensprovider voor SQL Server bevat geen ingebouwde hoofdsleutelarchiefprovider voor Azure Key Vault, maar deze is beschikbaar als een NuGet-pakket, dat u eenvoudig kunt integreren met uw toepassing. Zie voor meer informatie:

Een aangepaste provider voor kolom-hoofdsleutelopslag implementeren

Als u kolomhoofdsleutels wilt opslaan in een sleutelarchief dat niet wordt ondersteund door een bestaande provider, kunt u een aangepaste provider implementeren door de klasse SqlColumnEncryptionCngProvider uit te breiden en de provider te registreren met behulp van de methode SqlConnection.RegisterColumnEncryptionKeyStoreProviders .

public class MyCustomKeyStoreProvider : SqlColumnEncryptionKeyStoreProvider
    {
        public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey)
        {
            // Logic for encrypting a column encrypted key.
        }
        public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] EncryptedColumnEncryptionKey)
        {
            // Logic for decrypting a column encrypted key.
        }
    }  
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary\<string, SqlColumnEncryptionKeyStoreProvider> providers =
               new Dictionary\<string, SqlColumnEncryptionKeyStoreProvider>();
            providers.Add("MY_CUSTOM_STORE", customProvider);
            SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);
            providers.Add(SqlColumnEncryptionCertificateStoreProvider.ProviderName, customProvider);
            SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers); 
       // ...
        }

    }

Providers van kolomhoofdsleutelarchief gebruiken voor programmatische sleutelinrichting

Wanneer u versleutelde kolommen opent, vindt en roept de .NET Framework-gegevensprovider voor SQL Server transparant de hoofdsleutelarchiefprovider van de rechterkolom aan om versleutelingssleutels voor kolommen te ontsleutelen. Gewoonlijk roept uw toepassingscode geen providers van kolomhoofdsleutelarchieven aan. U kunt echter expliciet een provider instantiëren en aanroepen om Always Encrypted-sleutels programmatisch in te richten en te beheren: om een versleutelde sleutel voor kolomversleuteling te genereren en een kolomversleutelingssleutel te ontsleutelen (bijvoorbeeld als onderdeel van de rotatie van de hoofdsleutel van de kolom). Zie Overzicht van sleutelbeheer voor Always Encrypted voor meer informatie. Het implementeren van uw eigen hulpprogramma's voor sleutelbeheer is mogelijk alleen vereist als u een aangepaste sleutelarchiefprovider gebruikt. Wanneer u sleutels gebruikt die zijn opgeslagen in sleutelsarchieven, waarvoor ingebouwde providers bestaan en of in Azure Key Vault, kunt u bestaande hulpprogramma's, zoals SQL Server Management Studio of PowerShell, gebruiken om sleutels te beheren en in te richten. In het onderstaande voorbeeld ziet u hoe u een kolomversleutelingssleutel genereert en sqlColumnEncryptionCertificateStoreProvider Class gebruikt om de sleutel te versleutelen met een certificaat.

using System.Security.Cryptography;
static void Main(string[] args)
{
    byte[] EncryptedColumnEncryptionKey = GetEncryptedColumnEncryptionKey(); 
    Console.WriteLine("0x" + BitConverter.ToString(EncryptedColumnEncryptionKey).Replace("-", "")); 
    Console.ReadKey();
}

static byte[]  GetEncryptedColumnEncryptionKey()
{
    int cekLength = 32;
    String certificateStoreLocation = "CurrentUser";
    String certificateThumbprint = "698C7F8E21B2158E9AED4978ADB147CF66574180";
    // Generate the plaintext column encryption key.
    byte[] columnEncryptionKey = new byte[cekLength];
    RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
    rngCsp.GetBytes(columnEncryptionKey);

    // Encrypt the column encryption key with a certificate.
    string keyPath = String.Format(@"{0}/My/{1}", certificateStoreLocation, certificateThumbprint);
    SqlColumnEncryptionCertificateStoreProvider provider = new SqlColumnEncryptionCertificateStoreProvider();
    return provider.EncryptColumnEncryptionKey(keyPath, @"RSA_OAEP", columnEncryptionKey); 
}

Invloed van de prestaties van Always Encrypted beheren

Omdat Always Encrypted een versleutelingstechnologie aan de clientzijde is, worden de meeste prestatieoverheads aan de clientzijde waargenomen, niet in de database. Afgezien van de kosten van versleutelings- en ontsleutelingsbewerkingen, zijn de andere bronnen van prestatieoverhead aan de clientzijde:

  • Extra retouren naar de database om metagegevens voor queryparameters op te halen.
  • Roept een kolomhoofdsleutelarchief aan om toegang te krijgen tot een kolomhoofdsleutel.

In deze sectie worden de ingebouwde prestatieoptimalisaties in .NET Framework Provider voor SQL Server beschreven en wordt beschreven hoe u de impact van de bovenstaande twee factoren op de prestaties kunt beheren.

Rondreizen beheren om metagegevens voor queryparameters op te halen

Als Always Encrypted is ingeschakeld voor een verbinding, roept de .NET Framework-gegevensprovider voor SQL Server standaard sys.sp_describe_parameter_encryption aan voor elke geparameteriseerde query, waarbij de query-instructie (zonder parameterwaarden) wordt doorgegeven aan SQL Server. sys.sp_describe_parameter_encryption analyseert de query-instructie om erachter te komen of er parameters moeten worden versleuteld. Als dat het geval is, retourneert het de versleutelingsgerelateerde informatie waarmee de .NET Framework-gegevensprovider voor SQL Server parameterwaarden kan versleutelen. Het bovenstaande gedrag zorgt voor een hoog transparantieniveau voor de clienttoepassing. De toepassing (en de ontwikkelaar van de toepassing) hoeven zich niet bewust te zijn van welke query's toegang hebben tot versleutelde kolommen, zolang de waarden die zijn gericht op versleutelde kolommen worden doorgegeven aan de .NET Framework-gegevensprovider voor SQL Server in SqlParameter-objecten.

Cacheopslag van querymetagegevens

In .NET Framework 4.6.2 en hoger slaat de .NET Framework-gegevensprovider voor SQL Server de resultaten van sys.sp_describe_parameter_encryption voor elke query-instructie op. Dus als dezelfde query-instructie meerdere keren wordt uitgevoerd, roept het stuurprogramma sys.sp_describe_parameter_encryption slechts één keer aan. Caching van versleutelingsmetagegevens voor queryinstructies vermindert de prestatiekosten van het ophalen van metagegevens uit de database aanzienlijk. Caching is standaard ingeschakeld. U kunt het opslaan van metagegevens van parameters uitschakelen door de eigenschap SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled in te stellen op false, maar dit wordt niet aanbevolen, behalve in zeldzame gevallen, zoals hieronder wordt beschreven:

Overweeg een database met twee verschillende schema's: s1 en s2. Elk schema bevat een tabel met dezelfde naam: t. De definities van de tabellen s1.t en s2.t zijn identiek, behalve wat betreft eigenschappen die met versleuteling te maken hebben: een kolom met de naam c in s1.t is niet versleuteld, terwijl deze wel versleuteld is in s2.t. De database heeft twee gebruikers: u1 en u2. Het standaardschema voor de u1 gebruikers is s1. Het standaardschema is u2s2. Een .NET-toepassing opent twee verbindingen met de database, door de u1 gebruiker te imiteren op de ene verbinding en de u2 gebruiker op de andere verbinding. De toepassing verzendt een query met een parameter die is gericht op de c kolom via de verbinding voor de gebruiker u1 (de query geeft het schema niet op, dus wordt ervan uitgegaan dat het standaardgebruikersschema wordt gebruikt). Vervolgens verzendt de toepassing dezelfde query via de verbinding voor de u2 gebruiker. Als caching van querymetagegevens is ingeschakeld, wordt de cache na de eerste query gevuld met metagegevens die de c kolom aangeven, worden de queryparameterdoelen niet versleuteld. Omdat de tweede query dezelfde query-instructie heeft, worden de gegevens die in de cache zijn opgeslagen, gebruikt. Als gevolg hiervan verzendt het stuurprogramma de query zonder de parameter te versleutelen (wat onjuist is, omdat de doelkolom s2.t.c is versleuteld), waardoor de waarde voor tekst zonder opmaak van de parameter naar de server wordt gelekt. De server detecteert die incompatibiliteit en dwingt het stuurprogramma om de cache te vernieuwen, zodat de toepassing de query transparant opnieuw verzendt met de correct versleutelde parameterwaarde. In dat geval moet caching worden uitgeschakeld om te voorkomen dat gevoelige waarden naar de server worden gelekt.

Always Encrypted instellen op queryniveau

Als u de invloed van de prestaties van het ophalen van versleutelingsmetagegevens voor geparameteriseerde query's wilt beheren, kunt u Always Encrypted inschakelen voor afzonderlijke query's in plaats van deze in te stellen voor de verbinding. Op deze manier kunt u ervoor zorgen dat sys.sp_describe_parameter_encryption alleen wordt aangeroepen voor query's die u weet dat parameters zijn gericht op versleutelde kolommen. Houd er echter rekening mee dat u hierdoor de transparantie van versleuteling vermindert: als u versleutelingseigenschappen van uw databasekolommen wijzigt, moet u mogelijk de code van uw toepassing wijzigen om deze uit te lijnen met de schemawijzigingen.

Opmerking

Het instellen van Always Encrypted op queryniveau heeft beperkte prestatievoordelen in .NET 4.6.2 en latere versies, waarmee metagegevens van parameterversleuteling in cache worden geïmplementeerd.

Als u het always encrypted-gedrag van afzonderlijke query's wilt beheren, moet u deze constructor van SqlCommand en SqlCommandColumnEncryptionSetting gebruiken. Hier volgen enkele nuttige richtlijnen:

  • Als de meeste query's die door een clienttoepassing over een databaseverbinding worden verzonden, toegang hebben tot versleutelde kolommen:
    • Stel het trefwoord kolomversleutelingsinstelling in op Ingeschakeld.
    • Stel SqlCommandColumnEncryptionSetting.Disabled in voor afzonderlijke query's die geen toegang hebben tot versleutelde kolommen. Hierdoor worden zowel sys.sp_describe_parameter_encryption aanroepen als pogingen om waarden in de resultatenset te ontsleutelen uitgeschakeld.
    • Stel SqlCommandColumnEncryptionSetting.ResultSet in voor afzonderlijke query's die geen parameters hebben waarvoor versleuteling is vereist, maar haal gegevens op uit versleutelde kolommen. Hierdoor wordt het aanroepen van sys.sp_describe_parameter_encryption en parameterversleuteling uitgeschakeld. De query kan de resultaten van versleutelingskolommen ontsleutelen.
  • Als de meeste query's die een clienttoepassing via een databaseverbinding verzendt, geen toegang hebben tot versleutelde kolommen:
    • Stel het trefwoord kolomversleutelingsinstelling in op Uitgeschakeld.
    • Stel SqlCommandColumnEncryptionSetting.Enabled in voor afzonderlijke query's met parameters die moeten worden versleuteld. Hierdoor kunnen zowel sys.sp_describe_parameter_encryption worden aangeroepen als de ontsleuteling van queryresultaten die zijn opgehaald uit versleutelde kolommen.
    • Stel SqlCommandColumnEncryptionSetting.ResultSet in voor query's die geen parameters hebben waarvoor versleuteling is vereist, maar haal gegevens op uit versleutelde kolommen. Hierdoor wordt het aanroepen van sys.sp_describe_parameter_encryption en parameterversleuteling uitgeschakeld. De query kan de resultaten van versleutelingskolommen ontsleutelen.

In het onderstaande voorbeeld is Always Encrypted uitgeschakeld voor de databaseverbinding. De query die door de toepassing wordt uitgevoerd, heeft een parameter die is gericht op de kolom LastName die niet is versleuteld. De query haalt gegevens op uit de kolommen SSN en BirthDate die beide zijn versleuteld. In dat geval is het aanroepen van sys.sp_describe_parameter_encryption voor het ophalen van versleutelingsmetagegevens niet vereist. De ontsleuteling van de queryresultaten moet echter worden ingeschakeld, zodat de toepassing waarden voor tekst zonder opmaak kan ontvangen van de twee versleutelde kolommen. De instelling SqlCommandColumnEncryptionSetting.ResultSet wordt gebruikt om ervoor te zorgen.

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand cmd = new SqlCommand(@"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName]=@LastName",
connection, null, SqlCommandColumnEncryptionSetting.ResultSetOnly))
    {
        SqlParameter paramLastName = cmd.CreateParameter();
        paramLastName.ParameterName = @"@LastName";
        paramLastName.DbType = DbType.String;
        paramLastName.Direction = ParameterDirection.Input;
        paramLastName.Value = "Abel";
        paramLastName.Size = 50;
        cmd.Parameters.Add(paramLastName);
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
               if (reader.HasRows)
               {
                  while (reader.Read())
                  {
                     Console.WriteLine(@"{0}, {1}, {2}, {3}", reader[0], reader[1], reader[2], ((DateTime)reader[3]).ToShortDateString());
                  }
               }
            }
  } 
}

Caching van kolomversleutelingssleutels

Om het aantal aanroepen naar een kolomhoofdsleutelarchief te verminderen om kolomversleutelingssleutels te ontsleutelen, slaat de .NET Framework-gegevensprovider voor SQL Server de versleutelingssleutels voor kolommen in het geheugen op in de cache. Nadat de versleutelde kolom-encryptiesleutel is verkregen uit de databasemetagegevens, probeert het databasestuurprogramma eerst de bijbehorende kolom-encryptiesleutel in platte tekst te vinden die overeenkomt met de versleutelde waarde. Het stuurprogramma roept het sleutelarchief aan met de kolomhoofdsleutel, alleen als de versleutelde waarde voor kolomversleutelingssleutel niet in de cache kan worden gevonden.

Opmerking

In .NET Framework 4.6 en 4.6.1 worden kolomversleutelingssleutelvermeldingen in de cache nooit verwijderd. Dit betekent dat voor een bepaalde versleutelde kolomversleutelingssleutel het stuurprogramma slechts eenmaal contact opslaat met het sleutelarchief gedurende de levensduur van de toepassing.

In .NET Framework 4.6.2 en hoger worden de cachevermeldingen verwijderd na een configureerbaar time-to-live-interval om veiligheidsredenen. De standaardwaarde voor time-to-live is 2 uur. Als u strengere beveiligingsvoorwaarden hebt over hoelang kolomversleutelingssleutels in de cache kunnen worden opgeslagen in de toepassing, kunt u deze wijzigen met behulp van de eigenschap SqlConnection.ColumnEncryptionKeyCacheTtl.

Extra beveiliging inschakelen voor een geïnfecteerde SQL Server

De .NET Framework-gegevensprovider voor SQL Server is standaard afhankelijk van het databasesysteem (SQL Server of Azure SQL Database) om metagegevens te verstrekken over welke kolommen in de database worden versleuteld en hoe. Met de versleutelingsmetagegevens kan de .NET Framework-gegevensprovider voor SQL Server queryparameters versleutelen en queryresultaten ontsleutelen zonder invoer van de toepassing, waardoor het aantal wijzigingen dat nodig is in de toepassing aanzienlijk wordt verminderd. Als het SQL Server-proces echter wordt aangetast en een aanvaller knoeit met de metagegevens die SQL Server naar de .NET Framework-gegevensprovider voor SQL Server verzendt, kan de aanvaller mogelijk gevoelige informatie stelen. In deze sectie worden API's beschreven die u helpen een extra beveiligingsniveau te bieden tegen dit type aanval, tegen de prijs van verminderde transparantie.

Parameterversleuteling afdwingen

Voordat de .NET Framework-gegevensprovider voor SQL Server een geparameteriseerde query naar SQL Server verzendt, wordt SQL Server gevraagd (door sys.sp_describe_parameter_encryption aan te roepen) om de query-instructie te analyseren en informatie op te geven over welke parameters in de query moeten worden versleuteld. Een gecompromitteerd SQL Server-exemplaar kan de .NET Framework-gegevensprovider voor SQL Server misleiden door de metagegevens te verzenden die aangeven dat de parameter geen versleutelde kolom target, ook al is de kolom in de database versleuteld. Als gevolg hiervan zou de .NET Framework-gegevensprovider voor SQL Server de parameterwaarde niet versleutelen en deze als tekst zonder opmaak naar het gecompromitteerde SQL Server-exemplaar verzenden.

Om dergelijke aanvallen te voorkomen, kan een toepassing de eigenschap SqlParameter.ForceColumnEncryption voor de parameter instellen op true. Dit zorgt ervoor dat de .NET Framework-gegevensprovider voor SQL Server een uitzondering genereert als de metagegevens die het van de server heeft ontvangen, aangeeft dat de parameter niet hoeft te worden versleuteld.

Hoewel het gebruik van de eigenschap SqlParameter.ForceColumnEncryption de beveiliging verbetert, vermindert het ook de transparantie van versleuteling voor de clienttoepassing. Als u het databaseschema bijwerkt om de set versleutelde kolommen te wijzigen, moet u mogelijk ook toepassingswijzigingen aanbrengen.

Het volgende codevoorbeeld illustreert het gebruik van de eigenschap SqlParameter.ForceColumnEncryption om te voorkomen dat burgerservicenummers als tekst zonder opmaak naar de database worden verzonden.

SqlCommand cmd = _sqlconn.CreateCommand(); 

// Use parameterized queries to access Always Encrypted data. 
 
cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = @SSN;"; 

SqlParameter paramSSN = cmd.CreateParameter(); 
paramSSN.ParameterName = @"@SSN"; 
paramSSN.DbType = DbType.AnsiStringFixedLength; 
paramSSN.Direction = ParameterDirection.Input; 
paramSSN.Value = ssn; 
paramSSN.Size = 11; 
paramSSN.ForceColumnEncryption = true; 
cmd.Parameters.Add(paramSSN); 

SqlDataReader reader = cmd.ExecuteReader();

Vertrouwde kolomhoofdsleutelpaden configureren

De versleutelingsmetagegevens die SQL Server retourneert voor queryparameters gericht op versleutelde kolommen en de resultaten die worden opgehaald uit versleutelde kolommen, omvatten het sleutelpad van de kolomhoofdsleutel die het sleutelarchief identificeert en de locatie van de sleutel daarin. Als het SQL Server-exemplaar is aangetast, kan het sleutelpad worden verzonden dat de .NET Framework-gegevensprovider voor SQL Server omstuurt naar de locatie die wordt beheerd door een aanvaller. Dit kan leiden tot het lekken van sleutelopslagreferenties, in het geval van een sleutelarchief waarvoor de toepassing zich moet authentiseren.

Om dergelijke aanvallen te voorkomen, kan de toepassing de lijst met vertrouwde sleutelpaden voor een bepaalde server opgeven met behulp van de eigenschap SqlConnection.ColumnEncryptionTrustedMasterKeyPaths. Als de .NET Framework Data Provider voor SQL Server een sleutelpad buiten de lijst met vertrouwde sleutelpaden ontvangt, wordt er een exception gegenereerd.

Hoewel het instellen van vertrouwde sleutelpaden de beveiliging van uw toepassing verbetert, moet u de code of/en de configuratie van de toepassing wijzigen wanneer u de kolomhoofdsleutel roteert (wanneer het pad van de kolomhoofdsleutel verandert).

In het volgende voorbeeld ziet u hoe u hoofdsleutelpaden voor vertrouwde kolommen configureert:

// Configure trusted key paths to protect against fake key paths sent by a compromised SQL Server instance 
// First, create a list of trusted key paths for your server 
List<string> trustedKeyPathList = new List<string>(); 
trustedKeyPathList.Add("CurrentUser/my/425CFBB9DDDD081BB0061534CE6AB06CB5283F5Ea"); 

// Register the trusted key path list for your server 

SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(serverName, trustedKeyPathList);

Versleutelde gegevens kopiëren met SqlBulkCopy

Met SqlBulkCopy kunt u gegevens, die al zijn versleuteld en opgeslagen in de ene tabel, naar een andere tabel kopiëren zonder de gegevens te ontsleutelen. Ga als volgende te werk:

  • Zorg ervoor dat de versleutelingsconfiguratie van de doeltabel identiek is aan de configuratie van de brontabel. Beide tabellen moeten met name dezelfde kolommen hebben die zijn versleuteld en de kolommen moeten worden versleuteld met dezelfde versleutelingstypen en dezelfde versleutelingssleutels. Opmerking: als een van de doelkolommen anders is versleuteld dan de bijbehorende bronkolom, kunt u de gegevens in de doeltabel niet ontsleutelen na de kopieerbewerking. De gegevens zijn beschadigd.
  • Configureer beide databaseverbindingen, naar de brontabel en naar de doeltabel, zonder Always Encrypted ingeschakeld.
  • Stel de optie AllowEncryptedValueModifications in (zie SqlBulkCopyOptions). Opmerking: Wees voorzichtig bij het opgeven van AllowEncryptedValueModifications, omdat dit kan leiden tot beschadigde database omdat de .NET Framework-gegevensprovider voor SQL Server niet controleert of de gegevens inderdaad zijn versleuteld of als deze correct zijn versleuteld met hetzelfde versleutelingstype, algoritme en sleutel als de doelkolom.

De optie AllowEncryptedValueModifications is beschikbaar in .NET Framework 4.6.1 en nieuwere versies.

Hier volgt een voorbeeld waarmee gegevens uit de ene tabel naar de andere worden gekopieerd. De kolommen SSN en BirthDate worden verondersteld te worden versleuteld.

static public void CopyTablesUsingBulk(string sourceTable, string targetTable)
{
   string sourceConnectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
   string targetConnectionString = "Data Source= server64; Initial Catalog=Clinic; Integrated Security=true";
   using (SqlConnection connSource = new SqlConnection(sourceConnectionString))
   {
      connSource.Open();
      using (SqlCommand cmd = new SqlCommand(string.Format("SELECT [PatientID], [SSN], [FirstName], [LastName], [BirthDate] FROM {0}", sourceTable), connSource))
      {
         using (SqlDataReader reader = cmd.ExecuteReader())
         {
            SqlBulkCopy copy = new SqlBulkCopy(targetConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.AllowEncryptedValueModifications);
            copy.EnableStreaming = true;
            copy.DestinationTableName = targetTable;
            copy.WriteToServer(reader);
         }
      }
}

Always Encrypted-API-verwijzing

Naamruimte:System.Data.SqlClient

Assembly: System.Data (in System.Data.dll)

Naam Description Geïntroduceerd in .NET-versie
SqlColumnEncryptionCertificateStoreProvider-klasse Een sleutelopslagprovider voor de Windows-certificatenopslag. 4.6
SqlColumnEncryptionCngProvider Klasse Een sleutelopslagprovider voor de Cryptografie-API van Microsoft: Next Generation (CNG). 4.6.1
Klasse SqlColumnEncryptionCspProvider Een sleutelbeheerprovider voor cryptografische serviceproviders (CSP) van Microsoft CAPI. 4.6.1
SqlColumnEncryptionKeyStoreProvider-klasse Basisklasse van de sleutelopslagproviders. 4.6
Opsomming SqlCommandColumnEncryptionSetting Instellingen voor het inschakelen van versleuteling en ontsleuteling voor een databaseverbinding. 4.6
SqlConnectionColumnEncryptionSetting Opsomming Instellingen voor het beheren van het gedrag van Always Encrypted voor afzonderlijke query's. 4.6
Eigenschap SqlConnectionStringBuilder.ColumnEncryptionSetting Hiermee wordt Always Encrypted in de verbindingsreeks opgeslagen en ingesteld. 4.6
Eigenschap SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled Hiermee schakelt u caching van metagegevens van versleutelingsquery's in en uit. 4.6.2
SqlConnection-eigenschap ColumnEncryptionKeyCacheTtl Hiermee haalt en stelt u de levensduur in voor vermeldingen in de cache van kolomversleutelingssleutels. 4.6.2
Eigenschap SqlConnection.ColumnEncryptionTrustedMasterKeyPaths Hiermee kunt u een lijst met vertrouwde sleutelpaden instellen voor een databaseserver. Als tijdens het verwerken van een toepassingsquery het stuurprogramma een sleutelpad ontvangt dat niet in de lijst staat, mislukt de query. Deze eigenschap biedt extra bescherming tegen beveiligingsaanvallen die betrekking hebben op een gecompromitteerde SQL Server die valse sleutelpaden biedt, wat kan leiden tot het lekken van referenties voor het sleutelarchief. 4.6
SqlConnection.RegisterColumnEncryptionKeyStoreProviders Methode U kunt aangepaste sleutelopslagproviders registreren. Het is een woordenboek dat de namen van sleutelarchiefproviders koppelt aan de implementaties van sleutelarchiefproviders. 4.6
SqlCommand Constructor (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting) Hiermee kunt u het gedrag van Always Encrypted voor afzonderlijke query's beheren. 4.6
Eigenschap SqlParameter.ForceColumnEncryption Hiermee wordt versleuteling van een parameter afgedwongen. Als SQL Server het stuurprogramma informeert dat de parameter niet hoeft te worden versleuteld, mislukt de query met behulp van de parameter. Deze eigenschap biedt extra bescherming tegen beveiligingsaanvallen waarbij een geïnfecteerde SQL Server onjuiste versleutelingsmetagegevens aan de client biedt, wat kan leiden tot openbaarmaking van gegevens. 4.6
Nieuw trefwoord voor verbindingsreeks : Column Encryption Setting=enabled Hiermee schakelt u Always Encrypted-functionaliteit voor de verbinding in of uit. 4.6

Zie ook