Sdílet prostřednictvím


Použití funkce Always Encrypted se zprostředkovatelem dat rozhraní .NET Framework pro SQL Server

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Tento článek obsahuje informace o tom, jak vyvíjet aplikace rozhraní .NET Framework pomocí funkce Always Encrypted nebo Always Encryptedse zabezpečenými enklávy a zprostředkovatelem dat rozhraní .NET Framework pro SQL Server (System.Data.SqlClient).

Poznámka:

Použití zprostředkovatele dat rozhraní .NET Framework pro SQL Server (System.Data.SqlClient) se nedoporučuje pro nový vývoj. Další informace naleznete v tématu System.Data.SqlClient.

Funkce Always Encrypted umožňuje klientským aplikacím šifrovat citlivá data a nikdy nezoradit data nebo šifrovací klíče pro SQL Server nebo Azure SQL Database. Ovladač s povolenou funkcí Always Encrypted, například zprostředkovatel dat rozhraní .NET Framework pro SQL Server, toho dosahuje transparentním šifrováním a dešifrováním citlivých dat v klientské aplikaci. Ovladač automaticky určí, které parametry dotazu odpovídají citlivým databázovým sloupcům (chráněné pomocí funkce Always Encrypted) a před předáním dat sql Serveru nebo službě Azure SQL Database zašifruje hodnoty těchto parametrů. Ovladač podobně transparentně dešifruje data načtená ze šifrovaných databázových sloupců ve výsledcích dotazu. Další informace naleznete v tématu Vývoj aplikací pomocí funkce Always Encrypted a Vývoj aplikací pomocí funkce Always Encrypted se zabezpečenými enklávy.

Poznámka:

Zprostředkovatel dat rozhraní .NET Framework pro SQL Server (System.Data.SqlClient) nepodporuje použití enkláv VBS bez ověření identity.

Požadavky

Poznámka:

Úroveň podpory funkce Always Encrypted v konkrétních verzích rozhraní .NET Framework se liší. Odkazy rozhraní API Always Encrypted jsou uvedeny v následujících částech.

Povolení funkce Always Encrypted pro dotazy aplikací

Nejjednodušší způsob, jak povolit šifrování parametrů a dešifrování výsledků dotazu, které cílí na šifrované sloupce, je nastavení hodnoty klíčového slova připojovacího řetězce nastavení šifrování sloupce na povolenou.

Následuje příklad připojovacího řetězce, který umožňuje funkci Always Encrypted:

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

Následuje ekvivalentní příklad použití SqlConnectionStringBuilder.ColumnEncryptionSetting – vlastnost.

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

Funkce Always Encrypted je také možné povolit pro jednotlivé dotazy. Podívejte se na část Řízení výkonu funkce Always Encrypted níže. Povolení funkce Always Encrypted nestačí k úspěšnému šifrování nebo dešifrování. Musíte se také ujistit, že:

  • Aplikace má oprávnění databáze VIEW ANY COLUMN MASTER KEY DEFINITION a VIEW ANY COLUMN ENCRYPTION KEY DEFINITION, která jsou nutná pro přístup k metadatům o klíčích Always Encrypted v databázi. Podrobnosti najdete v části Oprávnění v Always Encrypted (databázový stroj).
  • Aplikace má přístup k hlavnímu klíči sloupce, který chrání šifrovací klíče sloupců a šifruje dotazované databázové sloupce.

Povolení funkce Always Encrypted se zabezpečenými enklávy

Počínaje rozhraním .NET Framework verze 4.7.2 ovladač podporuje funkci Always Encrypted se zabezpečenými enklávy.

Obecné informace o roli ovladače klienta ve výpočetních funkcích enklávy a ověření identity enklávy najdete v tématu Vývoj aplikací využívajících funkci Always Encrypted se zabezpečenými enklávami.

Konfigurace aplikace:

  1. Povolte funkci Always Encrypted pro dotazy aplikace, jak je vysvětleno v předchozí části.

  2. Integrujte balíček NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet s vaší aplikací. NuGet je knihovna zprostředkovatelů enkláv, implementující logiku na straně klienta pro protokoly ověření identity a pro vytvoření zabezpečeného kanálu se zabezpečenou enklávou.

  3. Aktualizujte konfiguraci aplikace (například v web.config nebo app.config) a definujte mapování mezi typem enklávy, nakonfigurovaným pro vaši databázi a poskytovatelem enklávy.

    1. Pokud používáte SQL Server a Host Guardian Service (HGS), musíte typ enklávy VBS namapovat na třídu Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider z NuGet balíčku.
    2. Pokud používáte Azure SQL Database a Microsoft Azure Attestation, musíte typ enklávy SGX namapovat na třídu `Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider` z balíčku NuGet.

    Podrobné pokyny k úpravě konfigurace aplikace najdete v tématu Kurz: Vývoj aplikace .NET Framework pomocí funkce Always Encrypted se zabezpečenými enklávy.

  4. Enclave Attestation URL Nastavte klíčové slovo v připojovacím řetězci databáze na adresu URL ověření identity (koncový bod služby ověření identity). Adresu URL ověření identity pro vaše prostředí potřebujete získat od správce služby ověření identity.

    1. Pokud používáte SQL Server a službu Strážce hostitele (HGS), podívejte se na Určení a sdílení attestační URL služby HGS.
    2. Pokud používáte Azure SQL Database a Microsoft Azure Attestation, přečtěte si téma Určení adresy URL pro zásady ověření.

Podrobný kurz najdete v tématu Kurz: Vývoj aplikace .NET Framework pomocí funkce Always Encrypted se zabezpečenými enklávy

Načítání a úpravy dat v šifrovaných sloupcích

Jakmile povolíte funkci Always Encrypted pro dotazy aplikací, můžete použít standardní rozhraní API ADO.NET (viz načítání a úpravy dat v ADO.NET) nebo zprostředkovatele dat rozhraní .NET Framework pro rozhraní SQL Server API definovaná v oboru názvů System.Data.SqlClient k načtení nebo úpravě dat v šifrovaných sloupcích databáze. Za předpokladu, že vaše aplikace má požadovaná oprávnění k databázi a má přístup k hlavnímu klíči sloupce, zprostředkovatel dat rozhraní .NET Framework pro SQL Server zašifruje všechny parametry dotazu, které cílí na šifrované sloupce, a dešifruje data načtená z šifrovaných sloupců vracející hodnoty prostého textu typů .NET, které odpovídají datovým typům SQL Serveru nastaveným pro sloupce ve schématu databáze. Pokud funkce Always Encrypted není povolená, dotazy s parametry, které cílí na šifrované sloupce, selžou. Dotazy můžou stále načítat data ze šifrovaných sloupců, pokud dotaz nemá žádné parametry, které cílí na šifrované sloupce. Zprostředkovatel dat rozhraní .NET Framework pro SQL Server se však nebude pokoušet dešifrovat žádné hodnoty načtené z šifrovaných sloupců a aplikace obdrží binární šifrovaná data (jako pole bajtů).

Následující tabulka shrnuje chování dotazů v závislosti na tom, jestli je funkce Always Encrypted povolená, nebo ne:

Charakteristika dotazu Funkce Always Encrypted je povolená a aplikace má přístup ke klíčům a metadatům klíčů. Funkce Always Encrypted je povolená a aplikace nemá přístup ke klíčům ani metadatům klíčů. Funkce Always Encrypted je zakázaná.
Dotazy s parametry, které cílí na šifrované sloupce Hodnoty parametrů jsou transparentně šifrované. Error Error
Dotazy načítající data ze šifrovaných sloupců bez parametrů určených pro šifrované sloupce. Výsledky z šifrovaných sloupců se transparentně dešifrují. Aplikace obdrží hodnoty prostého textu datových typů .NET odpovídající typům SQL Serveru nakonfigurovaným pro šifrované sloupce. Error Výsledky z šifrovaných sloupců se nešifrují. Aplikace přijímá šifrované hodnoty jako bajtová pole (bajt[]).

Následující příklady ilustrují načítání a úpravy dat v šifrovaných sloupcích. Příklady předpokládají cílovou tabulku s následujícím schématem. Sloupce SSN a BirthDate jsou šifrované.

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

Příklad vložení dat

Tento příklad vloží řádek do tabulky Pacienti. Všimněte si následujících věcí:

  • V ukázkovém kódu není nic specifického pro šifrování. Zprostředkovatel dat rozhraní .NET Framework pro SQL Server automaticky detekuje a šifruje parametry paramSSN a paramBirthdate , které cílí na šifrované sloupce. Díky tomu je šifrování pro aplikaci transparentní.
  • Hodnoty vložené do databázových sloupců, včetně šifrovaných sloupců, se předávají jako objekty SqlParameter . Při odesílání hodnot do nešifrovaných sloupců je použití SqlParameter volitelné (i když se důrazně doporučuje, protože pomáhá zabránit injektáži SQL), vyžaduje se pro hodnoty, které cílí na šifrované sloupce. Pokud byly hodnoty vložené do sloupců SSN nebo BirthDate předány jako literály vložené do příkazu dotazu, dotaz by selhal, protože zprostředkovatel dat rozhraní .NET Framework pro SQL Server by nemohl určit hodnoty v cílových šifrovaných sloupcích, takže by hodnoty nezašifroval. V důsledku toho by server odmítl je jako nekompatibilní se šifrovanými sloupci.
  • Datový typ parametru, který cílí na sloupec SSN, je nastavený na řetězec ANSI (non-Unicode), který se mapuje na datový typ char/varchar SQL Serveru. Pokud byl typ parametru nastavený na řetězec Unicode (String), který se mapuje na nchar/nvarchar, dotaz selže, protože Funkce Always Encrypted nepodporuje převody z šifrovaných hodnot nchar/nvarchar na šifrované hodnoty char/varchar. Informace o mapování datových typů najdete v tématu Mapování datových typů SYSTÉMU SQL Server .
  • Datový typ parametru vloženého do sloupce BirthDate je explicitně nastaven na cílový datový typ SQL Serveru pomocí sqlParameter.SqlDbType Vlastnost, a nespoléhat se na implicitní mapování typů .NET na datové typy SQL Serveru použité při použití sqlParameter.DbType Vlastnost. Ve výchozím nastavení se struktura DateTime mapuje na datový typ datetime SQL Serveru. Vzhledem k tomu, že datový typ sloupce BirthDate je datum a funkce Always Encrypted nepodporuje převod šifrovaných hodnot data a času na šifrované hodnoty data, použití výchozího mapování by vedlo k chybě.
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();
   } 
}

Příklad načítání dat ve formátu prostého textu

Následující příklad ukazuje filtrování dat na základě šifrovaných hodnot a načtení dat prostého textu z šifrovaných sloupců. Všimněte si následujících věcí:

  • Hodnota použitá v klauzuli WHERE k filtrování ve sloupci SSN musí být předána pomocí SqlParameter, aby zprostředkovatel dat rozhraní .NET Framework pro SQL Server mohl transparentně šifrovat před odesláním do databáze.
  • Všechny hodnoty vytištěné programem budou ve formátu prostého textu, protože zprostředkovatel dat rozhraní .NET Framework pro SQL Server transparentně dešifruje data načtená ze sloupců SSN a BirthDate.

Poznámka:

Dotazy můžou ve sloupcích provádět porovnání rovnosti, pokud jsou šifrované pomocí deterministického šifrování. Další informace naleznete v tématu Výběr deterministické nebo randomizované šifrování.

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());
 }

Příklad načítání šifrovaných dat

Pokud funkce Always Encrypted není povolená, dotaz může stále načítat data ze šifrovaných sloupců, pokud dotaz nemá žádné parametry, které cílí na šifrované sloupce.

Následující příklad ukazuje, jak načíst binární šifrovaná data z šifrovaných sloupců. Všimněte si následujících věcí:

  • Protože funkce Always Encrypted není v připojovacím řetězci povolená, dotaz vrátí šifrované hodnoty SSN a BirthDate jako pole bajtů (program převede hodnoty na řetězce).
  • Dotaz, který načítá data ze šifrovaných sloupců se zakázaným funkcí Always Encrypted, může mít parametry, pokud žádný z parametrů cílí na šifrovaný sloupec. Výše uvedené dotazy filtrují podle lastName, který není v databázi šifrovaný. Pokud dotaz filtrovaný podle SSN nebo BirthDate selže.
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]));
      }
   }
}

Předcházení běžným problémům při dotazování šifrovaných sloupců

Tato část popisuje běžné kategorie chyb při dotazování šifrovaných sloupců z aplikací .NET a několik pokynů, jak se jim vyhnout.

Chyby převodu nepodporovaného datového typu

Funkce Always Encrypted podporuje několik převodů pro šifrované datové typy. Podrobný seznam podporovaných převodů typů naleznete v části Always Encrypted. Pokud se chcete vyhnout chybám převodu datových typů, postupujte následovně:

  • Nastavte typy parametrů, které cílí na šifrované sloupce, takže datový typ parametru SQL Serveru je buď úplně stejný jako typ cílového sloupce, nebo je podporován převod datového typu SQL Serveru parametru na cílový typ sloupce. Požadované mapování datových typů .NET na konkrétní datové typy SQL Serveru můžete vynutit pomocí vlastnosti SqlParameter.SqlDbType.
  • Ověřte, zda je přesnost a měřítko parametrů, které se zaměřují na sloupce s datovými typy decimal a numeric v SQL Serveru, stejné jako přesnost a měřítko nakonfigurované pro cílový sloupec.
  • Ověřte, zda přesnost parametrů určených pro sloupce typu datetime2, datetimeoffset nebo time v SQL Serveru nepřesahuje přesnost cílového sloupce (v dotazech, které upravují hodnoty v cílovém sloupci).

Chyby způsobené předáváním prostého textu místo šifrovaných hodnot

Všechny hodnoty, které cílí na šifrovaný sloupec, musí být v aplikaci zašifrované. Při pokusu o vložení nebo úpravu nebo filtrování podle hodnoty prostého textu v zašifrovaném sloupci dojde k chybě podobné této:

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'

Pokud chcete těmto chybám zabránit, ujistěte se, že:

  • Funkce Always Encrypted je povolená pro dotazy aplikací, které cílí na šifrované sloupce (pro připojovací řetězec nebo v objektu SqlCommand pro konkrétní dotaz).
  • SqlParameter slouží k odesílání dat určených pro šifrované sloupce. Následující příklad ukazuje dotaz, který nesprávně filtruje literál/konstantu u šifrovaného sloupce (SSN) (místo předání literálu uvnitř objektu SqlParameter).
using (SqlCommand cmd = connection.CreateCommand())
{
   cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
cmd.ExecuteNonQuery();
}

Práce s úložišti pro hlavní klíče sloupců

Aby bylo možné zašifrovat hodnotu parametru nebo dešifrovat data ve výsledcích dotazu, musí zprostředkovatel dat rozhraní .NET Framework pro SQL Server získat šifrovací klíč sloupce nakonfigurovaný pro cílový sloupec. Šifrovací klíče sloupců jsou uloženy v šifrované podobě v metadatech databáze. Každý šifrovací klíč sloupce má odpovídající hlavní klíč sloupce, který se použil k šifrování šifrovacího klíče sloupce. Metadata databáze neukládají hlavní klíče sloupců a obsahují jenom informace o úložišti klíčů obsahujícím určitý hlavní klíč sloupce a umístění klíče v úložišti klíčů.

Pokud chcete získat hodnotu prostého textu šifrovacího klíče sloupce, zprostředkovatel dat rozhraní .NET Framework pro SQL Server nejprve získá metadata o šifrovacím klíči sloupce i jeho odpovídajícím hlavním klíči sloupce a pak použije informace v metadatech ke kontaktování úložiště klíčů, obsahující hlavní klíč sloupce a k dešifrování šifrovacího klíče šifrovaného sloupce. Zprostředkovatel dat rozhraní .NET Framework pro SQL Server komunikuje s úložištěm klíčů pomocí poskytovatele úložiště hlavních klíčů sloupců – což je instance třídy odvozené z třídy SqlColumnEncryptionKeyStoreProvider.

Proces získání šifrovacího klíče sloupce:

  1. Pokud je pro dotaz povolen funkce Always Encrypted, poskytovatel dat rozhraní .NET Framework pro SQL Server transparentně volá sys.sp_describe_parameter_encryption načíst metadata šifrování pro parametry, které cílí na šifrované sloupce, pokud má dotaz parametry. U šifrovaných dat obsažených ve výsledcích dotazu SQL Server automaticky připojí metadata šifrování. Informace o hlavním klíči sloupce zahrnují:

    • Název zprostředkovatele úložiště klíčů, který zapouzdřuje úložiště klíčů obsahující hlavní klíč sloupce.
    • Klíčová cesta, která určuje umístění hlavního klíče pro sloupec v úložišti klíčů.

    Mezi informace o šifrovacím klíči sloupce patří:

    • Hodnota klíče pro šifrování sloupce.
    • Název algoritmu, který se použil k šifrování šifrovacího klíče sloupce.
  2. Zprostředkovatel dat rozhraní .NET Framework pro SQL Server používá název poskytovatele úložiště hlavního klíče sloupce k vyhledání objektu zprostředkovatele, který je instancí třídy odvozené z třídy SqlColumnEncryptionKeyStoreProvider, v interní datové struktuře.

  3. K dešifrování šifrovacího klíče sloupce volá zprostředkovatel dat rozhraní .NET Framework pro SQL Server metodu SqlColumnEncryptionKeyStoreProvider.DecryptColumnEncryptionKey, přičemž předá cestu hlavního klíče sloupce, šifrovanou hodnotu šifrovacího klíče sloupce a název šifrovacího algoritmu, který byl použit k vytvoření šifrovaného šifrovacího klíče sloupce.

Použití integrovaných poskytovatelů úložišť hlavních klíčů pro sloupce

Zprostředkovatel dat rozhraní .NET Framework pro SQL Server obsahuje následující předdefinované poskytovatele hlavního úložiště klíčů sloupců, kteří jsou předem zaregistrováni s konkrétními názvy zprostředkovatelů (slouží k vyhledání poskytovatele).

Class Description Název zprostředkovatele (vyhledávání)
Třída SqlColumnEncryptionCertificateStoreProvider Zprostředkovatel pro Windows Certificate Store. MSSQL_CERTIFICATE_STORE
SqlColumnEncryptionCngProvider – třída

Poznámka: Tento zprostředkovatel je k dispozici v rozhraní .NET Framework 4.6.1 a novějších verzích.
Zprostředkovatel úložiště klíčů, který podporuje rozhraní Microsoft Cryptography API: API nové generace (CNG). Úložiště tohoto typu je obvykle modul hardwarového zabezpečení – fyzické zařízení, které chrání a spravuje digitální klíče a poskytuje kryptografické zpracování. MSSQL_CNG_STORE
SqlColumnEncryptionCspProvider – třída

Poznámka: Tento zprostředkovatel je k dispozici v rozhraní .NET Framework 4.6.1 nebo novějších verzích.
Zprostředkovatel úložiště klíčů, který podporuje rozhraní API kryptografie Microsoftu (CAPI). Úložiště tohoto typu je obvykle modul hardwarového zabezpečení – fyzické zařízení, které chrání a spravuje digitální klíče a poskytuje kryptografické zpracování. MSSQL_CSP_PROVIDER

Abyste mohli tyto poskytovatele používat, nemusíte provádět žádné změny kódu aplikace, ale mějte na paměti následující:

  • Vy nebo váš DBA potřebujete zajistit, že název poskytovatele, nakonfigurovaný v metadatech hlavního klíče sloupce, je správný a že cesta hlavního klíče sloupce je v souladu s formátem cesty klíče platným pro daného poskytovatele. Doporučujeme nakonfigurovat klíče pomocí nástrojů, jako je SQL Server Management Studio, které při vydávání příkazu CREATE COLUMN MASTER KEY (Transact-SQL) automaticky vygeneruje platné názvy zprostředkovatelů a cesty klíčů. Další informace najdete v tématu Konfigurace funkce Always Encrypted pomocí aplikace SQL Server Management Studio a konfigurace funkce Always Encrypted pomocí PowerShellu.
  • Ujistěte se, že vaše aplikace má přístup k klíči v úložišti klíčů. To může zahrnovat udělení přístupu ke klíči a/nebo úložišti klíčů, v závislosti na úložišti klíčů, nebo provádění dalších konfiguračních kroků specifických pro úložiště klíčů. Pokud například chcete získat přístup k úložišti klíčů implementující CNG nebo CAPI (například modul hardwarového zabezpečení), musíte se ujistit, že je na počítači aplikace nainstalovaná knihovna implementující CNG nebo CAPI pro váš obchod. Podrobnosti najdete v tématu Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted.

Použití zprostředkovatele služby Azure Key Vault

Azure Key Vault je pohodlná možnost ukládat a spravovat hlavní klíče sloupců pro Always Encrypted (zejména pokud jsou vaše aplikace hostované v Azure). Zprostředkovatel dat rozhraní .NET Framework pro SQL Server neobsahuje integrovaného zprostředkovatele úložiště hlavních klíčů sloupců pro Azure Key Vault, ale je k dispozici jako balíček NuGet, který můžete snadno integrovat s vaší aplikací. Podrobnosti najdete tady:

Implementace vlastního poskytovatele úložiště hlavního klíče pro sloupce

Pokud chcete uložit hlavní klíče sloupců do úložiště klíčů, které není podporováno existujícím poskytovatelem, můžete implementovat vlastního zprostředkovatele rozšířením třídy SqlColumnEncryptionCngProvider a registrací zprostředkovatele pomocí metody 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); 
       // ...
        }

    }

Použití zprostředkovatelů úložiště klíčů hlavního sloupce pro zřizování programových klíčů

Při přístupu k šifrovaným sloupcům poskytovatel dat rozhraní .NET Framework pro SQL Server automaticky vyhledá a zavolá poskytovatele úložiště hlavního klíče, aby dešifroval klíče šifrování sloupců. Kód běžné aplikace obvykle přímo nevolá poskytovatele úložiště sloupcových hlavních klíčů. Můžete však explicitně vytvořit instanci a zavolat poskytovatele ke programovému zřizování a správě klíčů Always Encrypted: k vygenerování šifrovacího klíče sloupce a jeho dešifrování (například jako součást rotace hlavního klíče pro sloupec). Další informace najdete v tématu Přehled správy klíčů pro funkci Always Encrypted. Implementace vlastních nástrojů pro správu klíčů může být nutná pouze v případě, že používáte vlastního zprostředkovatele úložiště klíčů. Pokud používáte klíče uložené v úložištích klíčů, pro které existují předdefinované poskytovatele, nebo ve službě Azure Key Vault, můžete ke správě a zřizování klíčů použít existující nástroje, jako je SQL Server Management Studio nebo PowerShell. Následující příklad znázorňuje generování šifrovacího klíče sloupce a použití třídy SqlColumnEncryptionCertificateStoreProvider k šifrování klíče pomocí certifikátu.

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); 
}

Řízení dopadu na výkon funkce Always Encrypted

Vzhledem k tomu, že funkce Always Encrypted je technologie šifrování na straně klienta, většina režijních nákladů na výkon se pozoruje na straně klienta, ne v databázi. Kromě nákladů na operace šifrování a dešifrování jsou další zdroje režijních nákladů na výkon na straně klienta:

  • Další dotazy k databázi za účelem načtení metadat pro parametry dotazu.
  • Volání k úložišti hlavního klíče, aby získalo přístup k hlavnímu klíči sloupce.

Tato část popisuje integrované optimalizace výkonu v zprostředkovateli rozhraní .NET Framework pro SQL Server a způsob řízení dopadu výše uvedených dvou faktorů na výkon.

Řízení doby odezvy za účelem načtení metadat pro parametry dotazu

Pokud je funkce Always Encrypted pro připojení ve výchozím nastavení povolená, bude zprostředkovatel dat rozhraní .NET Framework pro SQL Server volat sys.sp_describe_parameter_encryption pro každý parametrizovaný dotaz a předat příkaz dotazu (bez hodnot parametrů) sql Serveru. sys.sp_describe_parameter_encryption analyzuje příkaz dotazu, aby zjistil, jestli některé parametry musí být zašifrované, a pokud ano, vrátí informace související s šifrováním, které umožní zprostředkovatel dat rozhraní .NET Framework pro SQL Server šifrovat hodnoty parametrů. Výše uvedené chování zajišťuje vysokou úroveň transparentnosti klientské aplikace. Aplikace (a vývojář aplikace) nemusí vědět, které dotazy přistupují k šifrovaným sloupcům, pokud se hodnoty cílící na šifrované sloupce předávají zprostředkovateli dat rozhraní .NET Framework pro SQL Server v objektech SqlParameter.

Ukládání metadat dotazů do mezipaměti

V rozhraní .NET Framework 4.6.2 a novějším ukládá zprostředkovatel dat rozhraní .NET Framework pro SQL Server výsledky sys.sp_describe_parameter_encryption pro každý příkaz dotazu. Pokud se tedy stejný příkaz dotazu spustí několikrát, ovladač volá sys.sp_describe_parameter_encryption pouze jednou. Ukládání metadat šifrování do mezipaměti pro příkazy dotazů podstatně snižuje náklady na výkon při načítání metadat z databáze. Ukládání do mezipaměti je ve výchozím nastavení povolené. Ukládání metadat parametrů do mezipaměti můžete zakázat nastavením vlastnosti SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled na hodnotu false, ale nedoporučuje se to s výjimkou výjimečných případů, jako je ten popsaný níže:

Zvažte databázi, která má dvě různá schémata: s1 a s2. Každé schéma obsahuje tabulku se stejným názvem: t. Definice tabulek s1.t a s2.t jsou identické, s výjimkou vlastností souvisejících se šifrováním: Sloupec s názvem c, ve s1.t není šifrován, a je šifrován v s2.t. Databáze má dva uživatele: u1 a u2. Výchozí schéma pro u1 uživatele je s1. Výchozí schéma je u2s2. Aplikace .NET otevře dvě připojení k databázi, zosobní u1 uživatele na jednom připojení a u2 uživatele na jiném připojení. Aplikace odešle dotaz s parametrem, který cílí na c sloupec přes připojení pro uživatele u1 (dotaz nezadá schéma, takže se předpokládá výchozí schéma uživatele). V dalším kroku aplikace odešle stejný dotaz přes připojení uživatele u2 . Pokud je ukládání metadat dotazu do mezipaměti povolené, po prvním dotazu se mezipaměť naplní metadaty označujícími c sloupec, cíle parametrů dotazu se nešifrují. Protože druhý dotaz má stejný příkaz dotazu, použijí se informace uložené v mezipaměti. V důsledku toho ovladač odešle dotaz bez šifrování parametru (což je nesprávné, protože cílový sloupec s2.t.c je zašifrovaný), únik hodnoty prostého textu parametru na server. Server zjistí, že nekompatibilita a ovladač vynutí aktualizaci mezipaměti, takže aplikace transparentně odešle dotaz s správně zašifrovanou hodnotou parametru. V takovém případě by se ukládání do mezipaměti mělo zakázat, aby se zabránilo úniku citlivých hodnot na server.

Nastavení funkce Always Encrypted na úrovni dotazu

Pokud chcete řídit dopad na výkon načítání metadat šifrování pro parametrizované dotazy, můžete povolit funkci Always Encrypted pro jednotlivé dotazy místo nastavení pro připojení. Tímto způsobem můžete zajistit, že se sys.sp_describe_parameter_encryption volá jenom pro dotazy, o kterých víte, že mají parametry zaměřené na šifrované sloupce. Mějte ale na paměti, že tím snížíte transparentnost šifrování: pokud změníte vlastnosti šifrování vašich databázových sloupců, budete možná muset změnit kód aplikace tak, aby odpovídal změnám schématu.

Poznámka:

Nastavení funkce Always Encrypted na úrovni dotazu má omezené výhody výkonu v rozhraní .NET 4.6.2 a novějších verzích, které implementují ukládání metadat šifrování parametrů do mezipaměti.

Chcete-li řídit chování Always Encrypted jednotlivých dotazů, musíte použít tento konstruktor SqlCommand a SqlCommandColumnEncryptionSetting. Tady je několik užitečných pokynů:

  • Pokud většina dotazů, které klientská aplikace odešle, přistupuje k šifrovaným sloupcům v rámci databázového připojení:
    • Nastavte klíčové slovo připojovacího řetězce Nastavení šifrování sloupce na Povoleno.
    • Nastavte SqlCommandColumnEncryptionSetting.Disabled pro jednotlivé dotazy, které nemají přístup k žádným šifrovaným sloupcům. Tím zakážete volání sys.sp_describe_parameter_encryption i pokus o dešifrování všech hodnot v sadě výsledků.
    • Nastavte SqlCommandColumnEncryptionSetting.ResultSet pro jednotlivé dotazy, které nevyžadují žádné parametry vyžadující šifrování, ale načítají data ze šifrovaných sloupců. Tím se zakáže volání sys.sp_describe_parameter_encryption a šifrování parametrů. Dotaz bude moct dešifrovat výsledky ze sloupců šifrování.
  • Pokud většina dotazů, které klientská aplikace odesílá přes připojení k databázi, nemá přístup k šifrovaným sloupcům:
    • Nastavte klíčové slovo připojovacího řetězce Nastavení šifrování sloupce na Zakázáno.
    • Nastavte SqlCommandColumnEncryptionSetting.Enabled pro jednotlivé dotazy, které mají všechny parametry, které je potřeba zašifrovat. To umožní jak volání sys.sp_describe_parameter_encryption, tak dešifrování všech výsledků dotazu načtených ze šifrovaných sloupců.
    • Nastavte SqlCommandColumnEncryptionSetting.ResultSet pro dotazy, které neobsahují žádné parametry vyžadující šifrování, ale načítají data z šifrovaných sloupců. Tím se zakáže volání sys.sp_describe_parameter_encryption a šifrování parametrů. Dotaz bude moct dešifrovat výsledky ze sloupců šifrování.

V následujícím příkladu je funkce Always Encrypted pro připojení k databázi zakázaná. Dotaz, který aplikace vydává, má parametr, který cílí na sloupec LastName, který není šifrovaný. Dotaz načte data ze sloupců SSN i BirthDate, které jsou šifrované. V takovém případě není vyžadováno volání sys.sp_describe_parameter_encryption pro načtení metadat šifrování. Dešifrování výsledků dotazu je však potřeba povolit, aby aplikace získala hodnoty prostého textu ze dvou šifrovaných sloupců. K zajištění toho se používá nastavení SqlCommandColumnEncryptionSetting.ResultSet.

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());
                  }
               }
            }
  } 
}

Ukládání šifrovacích klíčů sloupců do mezipaměti

Aby se snížil počet volání do úložiště hlavního klíče sloupce pro dešifrování sloupcových šifrovacích klíčů, zprostředkovatel dat rozhraní .NET Framework pro SQL Server ukládá v paměti sloupcové šifrovací klíče v prostém textu. Po přijetí hodnoty šifrovacího klíče šifrovaného sloupce z metadat databáze se ovladač nejprve pokusí najít šifrovací klíč sloupce prostého textu, který odpovídá šifrované hodnotě klíče klíče. Ovladač volá úložiště klíčů obsahující hlavní klíč sloupce, pouze pokud nemůže v mezipaměti najít zašifrovanou hodnotu šifrovacího klíče sloupce.

Poznámka:

V rozhraní .NET Framework 4.6 a 4.6.1 se položky šifrovacího klíče sloupce v mezipaměti nikdy nevyřadí. To znamená, že pro daný šifrovaný šifrovací klíč sloupce ovladač kontaktuje úložiště klíčů pouze jednou během životnosti aplikace.

V rozhraní .NET Framework 4.6.2 a novějších se položky mezipaměti vyřadí po konfigurovatelném intervalu doby životnosti z bezpečnostních důvodů. Výchozí hodnota životnosti je 2 hodiny. Pokud máte přísnější požadavky na zabezpečení týkající se toho, jak dlouho lze šifrovací klíče sloupců ukládat do mezipaměti v prostém textu v aplikaci, můžete ho změnit pomocí vlastnosti SqlConnection.ColumnEncryptionKeyCacheTtl.

Povolení další ochrany pro ohrožený SQL Server

Ve výchozím nastavení zprostředkovatel dat rozhraní .NET Framework pro SQL Server využívá databázový systém (SQL Server nebo Azure SQL Database) k poskytování metadat o tom, které sloupce v databázi jsou šifrované a jak. Metadata šifrování umožňují zprostředkovateli dat rozhraní .NET Framework pro SQL Server šifrovat parametry dotazu a dešifrovat výsledky dotazu bez jakéhokoli vstupu z aplikace, což výrazně snižuje počet změn požadovaných v aplikaci. Pokud je proces SQL Serveru kompromitován a útočník manipuluje s metadaty, které SQL Server odesílá zprostředkovateli dat rozhraní .NET Framework pro SQL Server, může být schopen ukrást citlivé informace. Tato část popisuje rozhraní API, která pomáhají poskytovat dodatečnou úroveň ochrany proti tomuto typu útoku za cenu snížené transparentnosti.

Vynucení šifrování parametrů

Než poskytovatel dat rozhraní .NET Framework pro SQL Server odešle parametrizovaný dotaz na SQL Server, požádá SQL Server (voláním sys.sp_describe_parameter_encryption) k analýze příkazu dotazu a poskytnutí informací o parametrech v dotazu, které mají být zašifrovány. Ohrožená instance SQL Serveru by mohla uvést v omyl zprostředkovatele dat .NET Framework pro SQL Server tím, že odešle metadata označující, že parametr nesměřuje na šifrovaný sloupec, přestože je sloupec v databázi zašifrovaný. V důsledku toho zprostředkovatel dat rozhraní .NET Framework pro SQL Server nešifroval hodnotu parametru a odeslal by ji jako prostý text do ohrožené instance SQL Serveru.

Chcete-li zabránit takovému útoku, může aplikace nastavit SqlParameter.ForceColumnEncryption Vlastnost parametru na hodnotu true. To způsobí, že poskytovatel dat rozhraní .NET Framework pro SQL Server vyvolá výjimku, pokud metadata přijatá ze serveru indikují, že parametr nemusí být šifrovaný.

I když použití SqlParameter.ForceColumnEncryption Vlastnost pomáhá zlepšit zabezpečení, snižuje také transparentnost šifrování klientské aplikace. Pokud aktualizujete schéma databáze tak, aby změnilo sadu šifrovaných sloupců, možná budete muset provést i změny aplikace.

Následující ukázka kódu ukazuje použití SqlParameter.ForceColumnEncryption Vlastnost , aby se zabránilo odeslání čísel sociálního pojištění do databáze v prostém textu.

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();

Konfigurování cest důvěryhodného hlavního klíče sloupce

Šifrovací metadata, která SQL Server vrátí pro parametry dotazu zaměřené na šifrované sloupce a pro výsledky načtené ze šifrovaných sloupců, obsahují cestu k hlavnímu klíči sloupce, který identifikuje úložiště klíčů, a umístění klíče v úložišti klíčů. Pokud dojde k ohrožení zabezpečení instance SQL Serveru, může odeslat cestu ke klíči, která směruje zprostředkovatele dat rozhraní .NET Framework pro SQL Server do umístění řízeného útočníkem. Může to vést k úniku přihlašovacích údajů databáze klíčů v případě databáze klíčů, které vyžaduje, aby se aplikace autentizovala.

Aby se takovým útokům zabránilo, může aplikace určit seznam důvěryhodných cest klíčů pro daný server pomocí vlastnosti SqlConnection.ColumnEncryptionTrustedMasterKeyPaths. Pokud the.NET zprostředkovatel dat frameworku pro SQL Server obdrží cestu ke klíči mimo seznam důvěryhodných cest klíčů, vyvolá výjimku.

I když nastavení důvěryhodných cest klíčů zlepšuje zabezpečení aplikace, budete muset změnit kód nebo/a konfiguraci aplikace, kdykoli otočíte hlavní klíč sloupce (kdykoli se změní cesta k hlavnímu klíči sloupce).

Následující příklad ukazuje, jak nakonfigurovat cesty důvěryhodného hlavního klíče sloupce:

// 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);

Kopírování šifrovaných dat pomocí sqlBulkCopy

Pomocí sqlBulkCopy můžete kopírovat data, která jsou už zašifrovaná a uložená v jedné tabulce, do jiné tabulky bez dešifrování dat. Postup:

  • Ujistěte se, že konfigurace šifrování cílové tabulky je stejná jako konfigurace zdrojové tabulky. Konkrétně obě tabulky musí mít zašifrované stejné sloupce a sloupce musí být šifrované pomocí stejných typů šifrování a stejných šifrovacích klíčů. Poznámka: Pokud je některý z cílových sloupců zašifrovaný jinak než odpovídající zdrojový sloupec, nebudete po operaci kopírování moct dešifrovat data v cílové tabulce. Data budou poškozena.
  • Nakonfigurujte připojení databáze ke zdrojové tabulce i cílové tabulce bez povolené funkce Always Encrypted.
  • Nastavte možnost AllowEncryptedValueModifications (viz SqlBulkCopyOptions). Poznámka: Při zadávání allowEncryptedValueModifications buďte opatrní, protože to může vést k poškození databáze, protože zprostředkovatel dat rozhraní .NET Framework pro SQL Server nekontroluje, jestli jsou data skutečně zašifrovaná nebo jestli jsou správně zašifrovaná pomocí stejného typu šifrování, algoritmu a klíče jako cílový sloupec.

Možnost AllowEncryptedValueModifications je dostupná v rozhraní .NET Framework 4.6.1 a novějších verzích.

Tady je příklad, který kopíruje data z jedné tabulky do druhé. U sloupců SSN a BirthDate se předpokládá šifrování.

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);
         }
      }
}

Referenční informace k rozhraní API Always Encrypted

Obor názvů:System.Data.SqlClient

Shromáždění: System.Data (v System.Data.dll)

Název Description Představeno ve verzi .NET
Třída SqlColumnEncryptionCertificateStoreProvider Zprostředkovatel úložiště klíčů pro Windows Certificate Store. 4.6
SqlColumnEncryptionCngProvider – třída Zprostředkovatel úložiště klíčů pro rozhraní MICROSOFT Cryptography API: Next Generation (CNG). 4.6.1
SqlColumnEncryptionCspProvider – třída Zprostředkovatel úložiště klíčů pro poskytovatele kryptografických služeb (CSP) založených na rozhraní CAPI od Microsoftu 4.6.1
SqlColumnEncryptionKeyStoreProvider Class Základní třída poskytovatelů úložiště klíčů 4.6
SqlCommandColumnEncryptionSetting – výčet Nastavení pro povolení šifrování a dešifrování pro připojení k databázi 4.6
SqlConnectionColumnEncryptionSetting – výčet Nastavení pro řízení chování funkce Always Encrypted pro jednotlivé dotazy 4.6
SqlConnectionStringBuilder.ColumnEncryptionSetting – vlastnost Získá a nastaví Always Encrypted v připojovacím řetězci. 4.6
SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled – vlastnost Povolí a zakáže ukládání metadat šifrovacích dotazů do mezipaměti. 4.6.2
SqlConnection.ColumnEncryptionKeyCacheTtl – vlastnost Získá a nastaví parametry time-to-live pro položky v mezipaměti šifrovacího klíče sloupce. 4.6.2
SqlConnection.ColumnEncryptionTrustedMasterKeyPaths – vlastnost Umožňuje nastavit seznam důvěryhodných cest klíčů pro databázový server. Pokud při zpracování dotazu aplikace ovladač obdrží cestu ke klíči, která není v seznamu, dotaz selže. Tato vlastnost poskytuje dodatečnou ochranu před útoky na zabezpečení, které zahrnují ohrožený SQL Server poskytující cesty k falešným klíčům, což může vést k úniku přihlašovacích údajů k úložišti klíčů. 4.6
SqlConnection.RegisterColumnEncryptionKeyStoreProviders Metoda Umožňuje registrovat poskytovatele vlastních úložišť klíčů. Je to slovník, který mapuje názvy poskytovatelů úložiště klíčů na implementace poskytovatele úložiště klíčů. 4.6
Konstruktor SqlCommand (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting) Umožňuje řídit chování funkce Always Encrypted pro jednotlivé dotazy. 4.6
SqlParameter.ForceColumnEncryption – vlastnost Vynucuje šifrování parametru. Pokud SQL Server informuje ovladač, že parametr nemusí být šifrovaný, dotaz pomocí parametru selže. Tato vlastnost poskytuje dodatečnou ochranu před útoky na zabezpečení, které zahrnují ohrožený SQL Server poskytující klientovi nesprávná šifrovací metadata, což může vést ke zpřístupnění dat. 4.6
Nové klíčové slovo připojovacího řetězce : Column Encryption Setting=enabled Povolí nebo zakáže funkci Always Encrypted pro připojení. 4.6

Viz také