Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platný pro
- Microsoft ovladače 5.2 pro PHP a SQL Server
Úvod
Tento článek obsahuje informace o tom, jak vyvíjet aplikace PHP pomocí funkce Always Encrypted (databázový stroj) a ovladačů PHP pro SQL Server.
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 ovladač ODBC pro SQL Server, transparentně šifruje a dešifruje citlivá data 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 Always Encrypted (databázový stroj). Ovladače PHP pro SQL Server používají ovladač ODBC pro SQL Server k šifrování citlivých dat.
Požadavky
- Nakonfigurujte funkci Always Encrypted v databázi. Tato konfigurace zahrnuje zřízení klíčů Always Encrypted a nastavení šifrování pro vybrané sloupce databáze. Pokud ještě nemáte databázi s nakonfigurovanou funkcí Always Encrypted, postupujte podle pokynů v kurzu: Začínáme s funkcí Always Encrypted. Konkrétně by vaše databáze měla obsahovat definice metadat pro hlavní klíč sloupce (CMK), šifrovací klíč sloupce (CEK) a tabulku obsahující jeden nebo více sloupců zašifrovaných pomocí tohoto klíče CEK.
- Ujistěte se, že je na vývojovém počítači nainstalovaný ovladač ODBC pro SQL Server verze 17 nebo vyšší. Podrobnosti najdete v tématu Ovladač ODBC pro SQL Server.
Povolení funkce Always Encrypted v aplikaci PHP
Nejjednodušší způsob, jak povolit šifrování parametrů, které cílí na šifrované sloupce, a dešifrování výsledků dotazu, je nastavit klíčové slovo připojovacího řetězce ColumnEncryption na Enabled. Tady jsou příklady povolení funkce Always Encrypted v ovladačích SQLSRV a PDO_SQLSRV:
SQLSRV:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled");
$conn = sqlsrv_connect($server, $connectionInfo);
PDO_SQLSRV:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Povolení funkce Always Encrypted nestačí k úspěšnému šifrování nebo dešifrování; potřebujete také zajistit, aby:
- Aplikace má databázová oprávnění 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 tématu Oprávnění k databázi.
- Aplikace má přístup ke klíči CMK, který zabezpečuje CEKy pro dotazované šifrované sloupce. Tento požadavek závisí na poskytovateli úložiště klíčů, který ukládá klíč CMK. Další informace naleznete v tématu Práce s hlavními úložišti klíčů sloupců.
Načítání a úpravy dat v šifrovaných sloupcích
Po povolení funkce Always Encrypted pro připojení můžete k načtení nebo úpravě dat v šifrovaných databázových sloupcích použít standardní rozhraní API sqlSRV (viz referenční informace k rozhraní API ovladače SQLSRV) nebo rozhraní API PDO_SQLSRV (viz referenční informace k rozhraní API ovladače PDO_SQLSRV). 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, ovladač zašifruje všechny parametry dotazu, které cílí na šifrované sloupce, a dešifruje data načtená z šifrovaných sloupců, a transparentně se chová v aplikaci, jako by se sloupce nešifrovaly.
Pokud funkce Always Encrypted není povolená, dotazy s parametry, které cílí na šifrované sloupce, selžou. Data je možné načíst z šifrovaných sloupců, pokud dotaz nemá žádné parametry, které cílí na šifrované sloupce. Ovladač se však nepokusí o dešifrování 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á. |
|---|---|---|---|
| Parametry cílené na šifrované sloupce | Hodnoty parametrů jsou transparentně šifrované. | Error | Error |
| Načítání dat ze šifrovaných sloupců bez parametrů určených pro šifrované sloupce | Výsledky z šifrovaných sloupců se transparentně dešifrují. Aplikace přijímá hodnoty sloupců ve formátu prostého textu. | Error | Výsledky z šifrovaných sloupců se nešifrují. Aplikace přijímá šifrované hodnoty jako pole bajtů. |
Následující příklady ilustrují načítání a úpravy dat v šifrovaných sloupcích. Příklady předpokládají 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
Následující příklady ukazují, jak pomocí ovladačů SQLSRV a PDO_SQLSRV vložit řádek do tabulky Patient. Mějte na paměti následující body:
- V ukázkovém kódu není nic specifického pro šifrování. Ovladač automaticky rozpozná a zašifruje hodnoty parametrů SSN a BirthDate, které cílí na šifrované sloupce. Díky tomuto mechanismu bude šifrování pro aplikaci transparentní.
- Hodnoty vložené do databázových sloupců, včetně šifrovaných sloupců, se předávají jako vázané parametry. Použití parametrů je volitelné při odesílání hodnot do nešifrovaných sloupců (i když se důrazně doporučuje, protože pomáhá zabránit injektáži SQL), je vyžadován pro hodnoty cílené na šifrované sloupce. Pokud se hodnoty vložené do sloupců SSN nebo BirthDate předaly jako literály vložené do příkazu dotazu, dotaz selže, protože se ovladač nepokouší šifrovat nebo jinak zpracovávat literály v dotazech. V důsledku toho by server odmítl je jako nekompatibilní se šifrovanými sloupci.
- Při vkládání hodnot pomocí parametrů vazby musí být do databáze předán typ SQL, který je identický s datovým typem cílového sloupce nebo jehož převod na datový typ cílového sloupce je podporován. Důvodem tohoto požadavku je, že funkce Always Encrypted podporuje jen málo převodů typů (podrobnosti najdete v tématu Always Encrypted (databázový stroj)). Dva ovladače PHP, SQLSRV a PDO_SQLSRV, každý má mechanismus, který uživateli pomůže určit typ SQL hodnoty. Uživatel proto nemusí explicitně zadat typ SQL.
- Pro ovladač SQLSRV má uživatel dvě možnosti:
- Při určování a nastavení správného typu SQL se spoléháte na ovladač PHP. V tomto případě musí uživatel použít
sqlsrv_prepareasqlsrv_executespustit parametrizovaný dotaz. - Explicitně nastavte typ SQL.
- Při určování a nastavení správného typu SQL se spoléháte na ovladač PHP. V tomto případě musí uživatel použít
- U ovladače PDO_SQLSRV nemůže uživatel explicitně nastavit typ SQL parametru. Ovladač PDO_SQLSRV automaticky pomáhá uživateli určit typ SQL při vytváření vazby parametru.
- Pro ovladač SQLSRV má uživatel dvě možnosti:
- Aby ovladače určily typ SQL, platí některá omezení:
- Ovladač SQLSRV:
- Pokud chce, aby ovladač určil typy SQL pro šifrované sloupce, musí uživatel použít
sqlsrv_prepareasqlsrv_execute. - Pokud je preferováno
sqlsrv_query, uživatel zodpovídá za zadání typů SQL pro všechny parametry. Zadaný typ SQL musí zahrnovat délku řetězce pro řetězcové typy a škálování a preciznost pro desetinné typy.
- Pokud chce, aby ovladač určil typy SQL pro šifrované sloupce, musí uživatel použít
- ovladač PDO_SQLSRV:
- Atribut
PDO::SQLSRV_ATTR_DIRECT_QUERYpříkazu není v parametrizovaném dotazu podporovaný. - Atribut
PDO::ATTR_EMULATE_PREPARESpříkazu není v parametrizovaném dotazu podporovaný.
- Atribut
- Ovladač SQLSRV:
Ovladač SQLSRV a sqlsrv_prepare:
// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Abel;
$birthDate = "1996-10-19";
$params = array($ssn, $firstName, $lastName, $birthDate);
// during sqlsrv_prepare, the driver determines the SQL types for each parameter and pass them to SQL Server
$stmt = sqlsrv_prepare($conn, $query, $params);
sqlsrv_execute($stmt);
Ovladač SQLSRV a sqlsrv_query:
// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Abel";
$birthDate = "1996-10-19";
// need to provide the SQL types for ALL parameters
// note the SQL types (including the string length) have to be the same at the column definition
$params = array(array(&$ssn, null, null, SQLSRV_SQLTYPE_CHAR(11)),
array(&$firstName, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
array(&$lastName, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
array(&$birthDate, null, null, SQLSRV_SQLTYPE_DATE));
sqlsrv_query($conn, $query, $params);
PDO_SQLSRV ovladač a PDO::prepare:
// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Able";
$birthDate = "1996-10-19";
// during PDO::prepare, the driver determines the SQL types for each parameter and pass them to SQL Server
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $ssn);
$stmt->bindParam(2, $firstName);
$stmt->bindParam(3, $lastName);
$stmt->bindParam(4, $birthDate);
$stmt->execute();
Příklad načtení dat ve formátu prostého textu
Následující příklady ukazují filtrování dat na základě šifrovaných hodnot a načtení dat prostého textu ze šifrovaných sloupců pomocí ovladačů SQLSRV a PDO_SQLSRV. Mějte na paměti následující body:
- Hodnota použitá v klauzuli WHERE k filtrování ve sloupci SSN musí být předána pomocí parametru bind, aby ovladač mohl transparentně šifrovat před odesláním na server.
- Při provádění dotazu s vázanými parametry ovladače PHP automaticky určí typ SQL pro uživatele, pokud uživatel explicitně nezadá typ SQL při použití ovladače SQLSRV.
- Všechny hodnoty vytištěné programem jsou ve formátu prostého textu, protože ovladač transparentně dešifruje data načtená ze sloupců SSN a BirthDate.
Poznámka:
Dotazy můžou provádět porovnání rovnosti u šifrovaných sloupců pouze v případě, že šifrování je deterministické.
SQLSRV:
// since SSN is an encrypted column, need to pass the value in the WHERE clause through bind parameter
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = ?";
$ssn = "795-73-9838";
$stmt = sqlsrv_prepare($conn, $query, array(&$ssn));
// during sqlsrv_execute, the driver encrypts the ssn value and passes it to the database
sqlsrv_execute($stmt);
// fetch like usual
$row = sqlsrv_fetch_array($stmt);
PDO_SQLSRV:
// since SSN is an encrypted column, need to pass the value in the WHERE clause through bind parameter
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = ?";
$ssn = "795-73-9838";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $ssn);
// during PDOStatement::execute, the driver encrypts the ssn value and passes it to the database
$stmt->execute();
// fetch like usual
$row = $stmt->fetch();
Příklad načtení š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říklady ilustrují načtení binárních šifrovaných dat ze šifrovaných sloupců pomocí ovladačů SQLSRV a PDO_SQLSRV. Mějte na paměti následující body:
- Protože funkce Always Encrypted není v připojovacím řetězci povolená, vrátí dotaz š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. Následující dotazy filtrují podle lastName, který není v databázi šifrovaný. Pokud dotaz filtruje SSN nebo BirthDate, dotaz selže.
SQLSRV:
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName] = ?";
$lastName = "Abel";
$stmt = sqlsrv_prepare($conn, $query, array(&$lastName));
sqlsrv_execute($stmt);
$row = sqlsrv_fetch_array($stmt);
PDO_SQLSRV:
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName] = ?";
$lastName = "Abel";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $lastName);
$stmt->execute();
$row = $stmt->fetch();
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í PHP 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ů najdete viz Always Encrypted (databázový stroj) . Pokud se chcete vyhnout chybám převodu datových typů, postupujte následovně:
- Při použití ovladače SQLSRV s
sqlsrv_preparetypem SQL asqlsrv_executespolu s velikostí sloupce a počtem desetinných míst se parametr automaticky určí. - Při použití ovladače PDO_SQLSRV ke spuštění dotazu se automaticky určí také typ SQL s velikostí sloupce a počtem desetinných míst parametru.
- Při použití ovladače SQLSRV s
sqlsrv_queryk provedení dotazu:- Typ SQL parametru je buď přesně stejný jako typ cílového sloupce, nebo je podporován převod typu SQL na typ sloupce.
- Přesnost a měřítko parametrů, které cílí na sloupce datových
decimaltypů anumericdatových typů SQL Serveru, je stejné jako přesnost a měřítko konfigurované pro cílový sloupec. - Přesnost parametrů, které cílí na sloupce s datovými
datetime2typy ,datetimeoffsetnebotimeSQL Server, není větší než přesnost cílového sloupce v dotazech, které upravují cílový sloupec.
- Nepoužívejte atributy
PDO::SQLSRV_ATTR_DIRECT_QUERYpříkazů PDO_SQLSRV aniPDO::ATTR_EMULATE_PREPARESv parametrizovaném dotazu.
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 před odesláním na server zašifrovány. Při pokusu o vložení, úpravu nebo filtrování podle hodnoty prostého textu v zašifrovaném sloupci dojde k chybě. Pokud chcete těmto chybám zabránit, ujistěte se, že:
- Always Encrypted je povolené (v připojovacím řetězci nastavte klíčové slovo
ColumnEncryptionna hodnotuEnabled). - Parametr bind slouží k odesílání dat určených pro šifrované sloupce. Následující příklad ukazuje dotaz, který nesprávně filtruje literálem nebo konstantou u šifrovaného sloupce (SSN):
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
Ří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žie na výkon na straně klienta:
- Další cesty do databáze za účelem načtení metadat pro parametry dotazu.
- Volání do úložiště hlavního klíče sloupce za účelem přístupu k hlavnímu klíči sloupce.
Cyklické operace pro načítání metadat pro parametry dotazu
Pokud je pro připojení povoleno funkce Always Encrypted, ovladač ODBC ve výchozím nastavení zavolá sys.sp_describe_parameter_encryption pro každý parametrizovaný dotaz a předá příkaz dotazu (bez hodnot parametrů) SQL Serveru. Tato uložená procedura analyzuje příkaz dotazu, aby zjistil, jestli některé parametry musí být šifrované, a pokud ano, vrátí informace související s šifrováním pro každý parametr, aby ovladač mohl šifrovat.
Vzhledem k tomu, že ovladače PHP umožňují uživateli vytvořit vazbu parametru v připraveném příkazu bez poskytnutí typu SQL, při vazbě parametru v připojení s povolenou funkcí Always Encrypted volají ovladače PHP sqlDescribeParam na parametr získat typ SQL, velikost sloupce a desítkové číslice. Metadata se pak používají k volání SQLBindParameter. Tato nadbytečná SQLDescribeParam volání nevyžadují další komunikační cesty do databáze, protože ovladač ODBC již uložil informace na straně klienta, když bylo zavoláno sys.sp_describe_parameter_encryption.
Předchozí chování zajišťuje vysokou úroveň transparentnosti klientské aplikace (a vývojář aplikace) nemusí vědět o tom, které dotazy přistupují k šifrovaným sloupcům, pokud se hodnoty cílící na šifrované sloupce předávají ovladači v parametrech.
Na rozdíl od ovladače ODBC pro SQL Server se povolení funkce Always Encrypted na úrovni příkazu nebo dotazu zatím v ovladačích PHP nepodporuje.
Ukládání šifrovacích klíčů sloupců do mezipaměti
Ke snížení počtu volání do úložiště hlavních klíčů sloupce pro dešifrování sloupcových šifrovacích klíčů (CEK) ukládá ovladač dešifrované CEK do mezipaměti v paměti. Po přijetí šifrovaného klíče CEK (ECEK) z metadat databáze, se ovladač ODBC nejprve pokusí najít prostý text CEK odpovídající šifrované hodnotě klíče v mezipaměti. Ovladač volá úložiště klíčů obsahující klíč CMK pouze v případě, že nemůže najít odpovídající klíč CEK prostého textu v mezipaměti.
Poznámka: V ovladači ODBC pro SQL Server se položky v mezipaměti vyřadí po dvouhodinovém vypršení časového limitu. Toto chování znamená, že pro danou ECEK ovladač kontaktuje úložiště klíčů pouze jednou během běhu aplikace nebo každé dvě hodiny, podle toho, co nastane dříve.
Práce s úložišti pro hlavní klíče sloupců
Aby bylo možné šifrovat nebo dešifrovat data, musí ovladač získat klíč CEK nakonfigurovaný pro cílový sloupec. CEKs jsou uloženy v šifrované podobě (ECEKs) v metadatech databáze. Každý klíč CEK má odpovídající klíč CMK, který se použil k šifrování. Metadata databáze neukládá samotné CMK, ale obsahuje pouze název úložiště klíčů a informace, které může úložiště klíčů použít k vyhledání CMK.
Pokud chcete získat hodnotu prostého textu ECEK, ovladač nejprve získá metadata o klíči CEK i jeho odpovídající klíč CMK a použije tyto informace ke kontaktování úložiště klíčů obsahujícího CMK a požádá ho o dešifrování ECEK. Ovladač komunikuje s úložištěm klíčů pomocí poskytovatele úložiště klíčů.
Pro ovladač Microsoftu 5.3.0 pro PHP pro SQL Server jsou podporovány pouze zprostředkovatelé Windows Certificate Store Provider a Azure Key Vault. Druhý zprostředkovatel úložiště klíčů podporovaný ovladačem ODBC (vlastní zprostředkovatel úložiště klíčů) se zatím nepodporuje.
Použití zprostředkovatele Windows Certificate Store
Ovladač ODBC pro SQL Server ve Windows obsahuje integrovaného zprostředkovatele úložiště hlavních klíčů sloupců pro Úložiště certifikátů systému Windows s názvem MSSQL_CERTIFICATE_STORE. (Tento poskytovatel není k dispozici v systému macOS nebo Linux.) S tímto poskytovatelem je CMK uložena lokálně na klientském stroji a není potřeba žádná další konfigurace aplikací pro její použití s ovladačem. Aplikace ale musí mít přístup k certifikátu a jeho privátnímu klíči v úložišti. Další informace najdete v tématu Vytvoření a uložení hlavních klíčů sloupců (Always Encrypted).
Použití služby Azure Key Vault
Azure Key Vault nabízí způsob ukládání šifrovacích klíčů, hesel a dalších tajných kódů pomocí Azure a dá se použít k ukládání klíčů pro Always Encrypted. Ovladač ODBC pro SQL Server (verze 17 a vyšší) obsahuje integrovaného zprostředkovatele úložiště hlavních klíčů pro Azure Key Vault. Následující možnosti připojení zpracovávají konfiguraci služby Azure Key Vault: KeyStoreAuthentication, KeyStorePrincipalIda KeyStoreSecret.
-
KeyStoreAuthenticationmůže mít jednu ze dvou možných řetězcových hodnot:KeyVaultPasswordaKeyVaultClientSecret. Tyto hodnoty určují, jaký druh ověřovacích přihlašovacích údajů se používají s ostatními dvěma klíčovými slovy. -
KeyStorePrincipalIdpřebírá řetězec představující identifikátor účtu, jenž usiluje o získání přístupu ke službě Azure Key Vault.- Pokud
KeyStoreAuthenticationje nastavena naKeyVaultPassword, pakKeyStorePrincipalIdmusí být jméno uživatele Microsoft Entra. - Pokud
KeyStoreAuthenticationje nastavená hodnotaKeyVaultClientSecret,KeyStorePrincipalIdmusí to být ID klienta aplikace.
- Pokud
-
KeyStoreSecretpřebírá řetězec představující tajný klíč přihlašovacích údajů.- Pokud
KeyStoreAuthenticationje nastavená hodnotaKeyVaultPassword,KeyStoreSecretmusí to být heslo uživatele. - Pokud
KeyStoreAuthenticationje nastavená hodnotaKeyVaultClientSecret,KeyStoreSecretmusí být tajný kód aplikace přidružený k ID klienta aplikace.
- Pokud
Aby bylo možné používat Azure Key Vault, musí být v připojovacím řetězci všechny tři možnosti.
ColumnEncryption také musí být nastavena na Enabled. Pokud je ColumnEncryption nastaven na Disabled, ale možnosti služby Azure Key Vault jsou k dispozici, skript bude pokračovat bez chyb, ale neprovede se žádné šifrování.
Následující příklady ukazují, jak se připojit k SQL Serveru pomocí služby Azure Key Vault.
SQLSRV:
Použití účtu Microsoft Entra:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultPassword", "KeyStorePrincipalId"=>$MSEntraUsername, "KeyStoreSecret"=>$MSEntraPassword);
$conn = sqlsrv_connect($server, $connectionInfo);
Použití ID a tajného klíče klienta aplikace Azure:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultClientSecret", "KeyStorePrincipalId"=>$applicationClientID, "KeyStoreSecret"=>$applicationClientSecret);
$conn = sqlsrv_connect($server, $connectionInfo);
PDO_SQLSRV: Použití účtu Microsoft Entra:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultPassword; KeyStorePrincipalId = $AADUsername; KeyStoreSecret = $AADPassword;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Použití ID a tajného klíče klienta aplikace Azure:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultClientSecret; KeyStorePrincipalId = $applicationClientID; KeyStoreSecret = $applicationClientSecret;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Omezení ovladačů PHP při použití funkce Always Encrypted
SQLSRV a PDO_SQLSRV:
- Linux nebo macOS nepodporuje zprostředkovatele úložiště certifikátů Windows
- Vynucení šifrování parametrů
- Povolení funkce Always Encrypted na úrovni příkazu
- Při použití funkce Always Encrypted a ne-UTF8 národních prostředí na Linuxu a macOS (například "en_US.ISO-8859-1"), vkládání dat typu null nebo prázdného řetězce do šifrovaného sloupce char(n) nemusí fungovat, pokud není v systému nainstalována znaková stránka 1252.
Pouze SQLSRV:
- Použití
sqlsrv_querypro parametr vazby bez zadání typu SQL - Použití
sqlsrv_preparepro parametry vazby v dávce příkazů SQL
pouze PDO_SQLSRV:
-
PDO::SQLSRV_ATTR_DIRECT_QUERYatribut příkazu zadaný v parametrizovaném dotazu -
PDO::ATTR_EMULATE_PREPAREatribut příkazu zadaný v parametrizovaném dotazu - Vázání parametrů v dávce SQL příkazů
Ovladače PHP také dědí omezení uložená ovladačem ODBC pro SQL Server a databázi. Viz Omezení ovladače ODBC při použití omezení Always Encrypted a Always Encrypted.
Viz také
Průvodce programováním pro ovladač PHP SQL
Referenční informace k rozhraní API ovladače SQLSRV
Referenční informace k rozhraní API ovladače PDO_SQLSRV