Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op
- Microsoft Drivers 5.2 voor PHP voor SQL Server
Introductie
Dit artikel bevat informatie over het ontwikkelen van PHP-toepassingen met Always Encrypted (Database Engine) en de PHP-stuurprogramma's voor SQL Server.
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 het ODBC-stuurprogramma voor SQL Server, versleutelt en ontsleutelt transparant gevoelige gegevens in de clienttoepassing. 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 Always Encrypted (Database Engine) voor meer informatie. De PHP-stuurprogramma's voor SQL Server gebruiken het ODBC-stuurprogramma voor SQL Server om gevoelige gegevens te versleutelen.
Vereiste voorwaarden
- Configureer Always Encrypted voor uw database. Deze configuratie omvat het inrichten van Always Encrypted-sleutels en het instellen van versleuteling voor geselecteerde databasekolommen. Als u nog geen database met Always Encrypted hebt geconfigureerd, volgt u de aanwijzingen in de zelfstudie: Aan de slag met Always Encrypted. In het bijzonder moet uw database de metagegevensdefinities voor een CMK (Column Master Key), een Kolomversleutelingssleutel (CEK) en een tabel bevatten die een of meer kolommen bevat die zijn versleuteld met die CEK.
- Zorg ervoor dat het ODBC-stuurprogramma voor SQL Server versie 17 of hoger is geïnstalleerd op uw ontwikkelcomputer. Zie ODBC-stuurprogramma voor SQL Server voor meer informatie.
Always Encrypted inschakelen in een PHP-toepassing
De eenvoudigste manier om de versleuteling van parameters die zijn gericht op de versleutelde kolommen en de ontsleuteling van queryresultaten in te schakelen, is door de waarde van het trefwoord voor de ColumnEncryption verbindingsreeks in te stellen op Enabled. Hieronder ziet u voorbeelden van het inschakelen van Always Encrypted in de SQLSRV- en PDO_SQLSRV-stuurprogramma's:
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);
Het inschakelen van Always Encrypted is niet voldoende voor versleuteling of ontsleuteling om te slagen; U moet er ook voor zorgen dat:
- De toepassing heeft de RECHTEN ELKE KOLOMHOOFDSLEUTELDEFINITIE BEKIJKEN en RECHTEN ELKE KOLOMVERSLEUTELINGSSLEUTELDEFINITIE BEKIJKEN databasepermissies, die vereist zijn voor toegang tot de metagegevens van Always Encrypted-sleutels in de database. Zie Databasemachtiging voor meer informatie.
- De toepassing kan toegang krijgen tot de CMK die de CEKs voor de gevraagde versleutelde kolommen beveiligt. Deze vereiste is afhankelijk van de sleutelopslagprovider waarin de CMK (hoofdcryptografische sleutel) wordt opgeslagen. Zie Werken met kolomhoofdsleutelarchieven voor meer informatie.
Gegevens ophalen en wijzigen in versleutelde kolommen
Zodra u Always Encrypted hebt ingeschakeld voor een verbinding, kunt u standaard SQLSRV-API's gebruiken (zie NAslaginformatie over de SQLSRV-stuurprogramma-API) of PDO_SQLSRV API's (zie PDO_SQLSRV Driver API Reference) om gegevens op te halen of te wijzigen in versleutelde databasekolommen. Ervan uitgaande dat uw toepassing over de vereiste databasemachtigingen beschikt en toegang heeft tot de hoofdsleutel van de kolom, versleutelt het stuurprogramma alle queryparameters die zijn gericht op versleutelde kolommen en ontsleuteling van gegevens die zijn opgehaald uit versleutelde kolommen, waardoor de toepassing transparant werkt alsof de kolommen niet zijn versleuteld.
Als Always Encrypted niet is ingeschakeld, mislukken query's met parameters die zijn gericht op versleutelde kolommen. Gegevens kunnen nog steeds worden opgehaald uit versleutelde kolommen, zolang de query geen parameters bevat die zijn gericht op versleutelde kolommen. Het stuurprogramma probeert echter geen ontsleuteling uit te voeren en de toepassing ontvangt de binaire versleutelde gegevens (als bytematrices).
De volgende tabel bevat een overzicht van het gedrag van query's, afhankelijk van of Always Encrypted is ingeschakeld of niet:
| Kenmerk van de query | 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 |
|---|---|---|---|
| Parameters die zijn gericht op versleutelde kolommen. | Parameterwaarden worden transparant versleuteld. | Fout | Fout |
| Gegevens ophalen uit versleutelde kolommen, zonder parameters die zijn gericht op versleutelde kolommen. | Resultaten van versleutelde kolommen worden transparant ontsleuteld. De toepassing ontvangt kolomwaarden als platte tekst. | Fout | Resultaten van versleutelde kolommen worden niet ontsleuteld. De toepassing ontvangt versleutelde waarden als bytematrices. |
De volgende voorbeelden illustreren het ophalen en wijzigen van gegevens in versleutelde kolommen. In de voorbeelden wordt uitgegaan van een tabel met het volgende schema. 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 gegevensinvoeging
In de volgende voorbeelden ziet u hoe u de SQLSRV- en PDO_SQLSRV-stuurprogramma's gebruikt om een rij in de tabel Patiënt in te voegen. Let op de volgende punten:
- Er is niets specifieks voor versleuteling in de voorbeeldcode. Het stuurprogramma detecteert en versleutelt automatisch de waarden van de parameters SSN en BirthDate, die zijn gericht op versleutelde kolommen. Dit mechanisme maakt versleuteling transparant voor de toepassing.
- De waarden die zijn ingevoegd in databasekolommen, inclusief de versleutelde kolommen, worden doorgegeven als afhankelijke parameters. Hoewel het gebruik van parameters 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 als letterlijke waarden die zijn ingesloten in de query-instructie, worden doorgegeven, mislukt de query omdat het stuurprogramma geen letterlijke waarden in query's probeert te versleutelen of anderszins te verwerken. Als gevolg hiervan weigert de server deze als niet compatibel met de versleutelde kolommen.
- Wanneer u waarden invoegt met behulp van bindingsparameters, moet een SQL-type dat identiek is aan het gegevenstype van de doelkolom of waarvan de conversie naar het gegevenstype van de doelkolom wordt ondersteund, worden doorgegeven aan de database. Deze vereiste is omdat Always Encrypted weinig typeconversies ondersteunt (zie Always Encrypted (Database Engine) voor meer informatie. De twee PHP-stuurprogramma's, SQLSRV en PDO_SQLSRV, hebben elk een mechanisme om de gebruiker te helpen het SQL-type van de waarde te bepalen. Als zodanig hoeft de gebruiker het SQL-type niet expliciet op te geven.
- Voor het SQLSRV-stuurprogramma heeft de gebruiker twee opties:
- Vertrouw op het PHP-stuurprogramma om het juiste SQL-type te bepalen en in te stellen. In dit geval moet de gebruiker een geparameteriseerde query gebruiken
sqlsrv_prepareensqlsrv_executeuitvoeren. - Stel het SQL-type expliciet in.
- Vertrouw op het PHP-stuurprogramma om het juiste SQL-type te bepalen en in te stellen. In dit geval moet de gebruiker een geparameteriseerde query gebruiken
- Voor het PDO_SQLSRV-stuurprogramma kan de gebruiker het SQL-type van een parameter niet expliciet instellen. Het stuurprogramma PDO_SQLSRV helpt de gebruiker automatisch bij het bepalen van het SQL-type bij het binden van een parameter.
- Voor het SQLSRV-stuurprogramma heeft de gebruiker twee opties:
- Voor het bepalen van het SQL-type gelden enkele beperkingen voor de stuurprogramma's:
- SQLSRV-stuurprogramma:
- Als de gebruiker wil dat het stuurprogramma de SQL-typen voor de versleutelde kolommen bepaalt, moet de gebruiker deze gebruiken
sqlsrv_prepareensqlsrv_execute. - Als
sqlsrv_querydit de voorkeur heeft, is de gebruiker verantwoordelijk voor het opgeven van de SQL-typen voor alle parameters. Het opgegeven SQL-type moet de tekenreekslengte voor tekenreekstypen bevatten en de schaal en precisie voor decimale typen.
- Als de gebruiker wil dat het stuurprogramma de SQL-typen voor de versleutelde kolommen bepaalt, moet de gebruiker deze gebruiken
- PDO_SQLSRV stuurprogramma:
- Het instructiekenmerk
PDO::SQLSRV_ATTR_DIRECT_QUERYwordt niet ondersteund in een geparameteriseerde query. - Het instructiekenmerk
PDO::ATTR_EMULATE_PREPARESwordt niet ondersteund in een geparameteriseerde query.
- Het instructiekenmerk
- SQLSRV-stuurprogramma:
SQLSRV-stuurprogramma en 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);
SQLSRV-stuurprogramma en 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 driver en 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();
Voorbeeld van het ophalen van platte tekst gegevens
In de volgende voorbeelden ziet u hoe u gegevens filtert op basis van versleutelde waarden en gegevens zonder opmaak opvragen uit versleutelde kolommen met behulp van de SQLSRV- en PDO_SQLSRV-stuurprogramma's. Let op de volgende punten:
- De waarde die wordt gebruikt in de WHERE-component om te filteren op de SSN-kolom moet worden doorgegeven met behulp van de bindingsparameter, zodat het stuurprogramma deze transparant kan versleutelen voordat het naar de server wordt verzonden.
- Bij het uitvoeren van een query met afhankelijke parameters bepaalt de PHP-stuurprogramma's automatisch het SQL-type voor de gebruiker, tenzij de gebruiker expliciet het SQL-type opgeeft wanneer het SQLSRV-stuurprogramma wordt gebruikt.
- Alle waarden die door het programma worden afgedrukt, zijn in tekst zonder opmaak, omdat het stuurprogramma de gegevens die zijn opgehaald uit de kolommen SSN en BirthDate transparant ontsleutelt.
Opmerking
Query's kunnen alleen gelijkheidsvergelijkingen uitvoeren voor versleutelde kolommen als de versleuteling deterministisch is.
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();
Voorbeeld van het ophalen van gegevens in ciphertext
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 de volgende voorbeelden ziet u hoe u binaire versleutelde gegevens opvragen uit versleutelde kolommen met behulp van de SQLSRV- en PDO_SQLSRV-stuurprogramma's. Let op de volgende punten:
- Omdat Always Encrypted niet is ingeschakeld in de verbindingsreeks, retourneert de query versleutelde waarden van SSN en BirthDate als bytematrices (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 volgende query filtert op LastName, die niet is versleuteld in de database. Als de query wordt gefilterd op SSN of Geboortedatum, mislukt de query.
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();
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 PHP-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 (Database Engine) voor de gedetailleerde lijst met ondersteunde typeconversies. Ga als volgt te werk om conversiefouten van gegevenstypen te voorkomen:
- Wanneer u het SQLSRV-stuurprogramma gebruikt met
sqlsrv_prepareensqlsrv_executehet SQL-type, samen met de kolomgrootte en het aantal decimale cijfers van de parameter, wordt automatisch bepaald. - Wanneer u het stuurprogramma PDO_SQLSRV gebruikt om een query uit te voeren, wordt het SQL-type met de kolomgrootte en het aantal decimale cijfers van de parameter ook automatisch bepaald
- Wanneer u het SQLSRV-stuurprogramma met
sqlsrv_querygebruikt om een query uit te voeren:- Het SQL-type van de parameter is exact hetzelfde als het type van de doelkolom of de conversie van het SQL-type naar het type van de kolom wordt ondersteund.
- De precisie en schaal van de parameters die zijn gericht op kolommen van de
decimalennumericSQL Server-gegevenstypen, zijn hetzelfde als de precisie en schaal die zijn geconfigureerd voor de doelkolom. - De precisie van parameters die gericht zijn op de kolommen
datetime2,datetimeoffsetoftimevan SQL Server-gegevenstypen is niet groter dan de precisie van de doelkolom, in query's die de doelkolom wijzigen.
- Gebruik geen PDO_SQLSRV instructiekenmerken
PDO::SQLSRV_ATTR_DIRECT_QUERYofPDO::ATTR_EMULATE_PREPARESin een geparameteriseerde query
Fouten vanwege het doorgeven van tekst zonder opmaak in plaats van versleutelde waarden
Elke waarde die gericht is op een versleutelde kolom, moet worden versleuteld voordat deze naar de server wordt verzonden. Een poging om een waarde voor tekst zonder opmaak in te voegen, te wijzigen of te filteren op een versleutelde kolom resulteert in een fout. Als u dergelijke fouten wilt voorkomen, moet u ervoor zorgen dat:
- Always Encrypted is ingeschakeld (in de verbindingsreeks stelt u het
ColumnEncryptiontrefwoord in opEnabled). - U gebruikt de bindingsparameter om gegevens te verzenden die zijn gericht op versleutelde kolommen. In het volgende voorbeeld ziet u een query die verkeerd filtert op een waarde/constante in een versleutelde kolom (SSN):
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
Invloed van de prestaties van Always Encrypted beheren
Omdat Always Encrypted een versleutelingstechnologie aan de clientzijde is, wordt de meeste prestatieoverhead waargenomen aan de clientzijde, niet in de database. Afgezien van de kosten van versleutelings- en ontsleutelingsbewerkingen, zijn de andere bronnen van prestatie-overhead 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.
Rondreizen om metagegevens voor queryparameters op te halen
Als Always Encrypted is ingeschakeld voor een verbinding, roept het ODBC-stuurprogramma standaard sys.sp_describe_parameter_encryption aan voor elke geparameteriseerde query, waarbij de query-instructie (zonder parameterwaarden) wordt doorgegeven aan SQL Server. Met deze opgeslagen procedure wordt de query-instructie geanalyseerd om erachter te komen of parameters moeten worden versleuteld. Als dat het geval is, worden de versleutelingsgerelateerde gegevens voor elke parameter geretourneerd, zodat het stuurprogramma deze kan versleutelen.
Omdat de PHP-stuurprogramma's de gebruiker in staat stellen om een parameter in een voorbereide instructie te binden zonder het SQL-type op te geven, wordt bij het binden van een parameter in een always encrypted-verbinding, de PHP-stuurprogramma's SQLDescribeParam op de parameter aangeroepen om het SQL-type, de kolomgrootte en decimale cijfers op te halen. De metagegevens worden vervolgens gebruikt om SQLBindParameter aan te roepen. Voor deze extra aanroepen zijn geen extra SQLDescribeParam rondgangen naar de database vereist, omdat het ODBC-stuurprogramma de informatie al op de clientzijde heeft opgeslagen toen sys.sp_describe_parameter_encryption werd aangeroepen.
Het voorgaande gedrag zorgt voor een hoog transparantieniveau voor de clienttoepassing (en de ontwikkelaar van de toepassing) hoeft niet te weten welke query's toegang hebben tot versleutelde kolommen, zolang de waarden die zijn gericht op versleutelde kolommen worden doorgegeven aan het stuurprogramma in parameters.
In tegenstelling tot het ODBC-stuurprogramma voor SQL Server wordt het inschakelen van Always Encrypted op instructie-/queryniveau nog niet ondersteund in de PHP-stuurprogramma's.
Caching van sleutels voor kolomversleuteling
Als u het aantal aanroepen naar een kolomhoofdsleutelarchief wilt verminderen om kolomversleutelingssleutels (CEK) te ontsleutelen, slaat het stuurprogramma de CEK's zonder opmaak in het geheugen op. Na ontvangst van de versleutelde CEK (ECEK) uit databasemetagegevens, probeert het ODBC-stuurprogramma eerst de lege tekst CEK te vinden die overeenkomt met de versleutelde sleutelwaarde in de cache. Het stuurprogramma roept het sleutelarchief met de CMK alleen aan als de bijbehorende lege tekst-CEK niet in de cache kan worden gevonden.
Opmerking: in het ODBC-stuurprogramma voor SQL Server worden de vermeldingen in de cache verwijderd na een time-out van twee uur. Dit gedrag betekent dat het stuurprogramma voor een bepaalde ECEK slechts eenmaal in contact komt met het sleutelarchief tijdens de levensduur van de toepassing of om de twee uur, afhankelijk van wat minder is.
Werken met opslagplaatsen voor kolom hoofdsleutels
Als u gegevens wilt versleutelen of ontsleutelen, moet het stuurprogramma een CEK verkrijgen die is geconfigureerd voor de doelkolom. CEK's worden opgeslagen in versleutelde vorm (ECEK's) in de metagegevens van de database. Elke CEK heeft een bijbehorende CMK die is gebruikt om deze te versleutelen. De metagegevens van de database slaan de CMK zelf niet op; deze bevat alleen de naam van het sleutelarchief en informatie die het sleutelarchief kan gebruiken om de CMK te vinden.
Om de waarde voor tekst zonder opmaak van een ECEK te verkrijgen, verkrijgt het stuurprogramma eerst de metagegevens over zowel de CEK als de bijbehorende CMK. Vervolgens wordt deze informatie gebruikt om contact op te maken met het sleutelarchief dat de CMK bevat en vraagt het om de ECEK te ontsleutelen. Het stuurprogramma communiceert met een sleutelarchief met behulp van een sleutelarchiefprovider.
Voor Microsoft Driver 5.3.0 voor PHP voor SQL Server worden alleen Windows Certificate Store Provider en Azure Key Vault ondersteund. De andere sleutelarchiefprovider die wordt ondersteund door het ODBC-stuurprogramma (aangepaste sleutelarchiefprovider) wordt nog niet ondersteund.
De Windows Certificate Store-provider gebruiken
Het ODBC-stuurprogramma voor SQL Server in Windows bevat een ingebouwde hoofdsleutelarchiefprovider voor het Windows-certificaatarchief met de naam MSSQL_CERTIFICATE_STORE. (Deze provider is niet beschikbaar in macOS of Linux.) Met deze provider wordt de CMK lokaal opgeslagen op de clientcomputer en is er geen andere configuratie door de toepassing nodig om deze te gebruiken met het stuurprogramma. De toepassing moet echter toegang hebben tot het certificaat en de bijbehorende privésleutel in de opslag. Zie voor meer informatie Kolomhoofdsleutels maken en opslaan (Always Encrypted).
Azure Key Vault gebruiken
Azure Key Vault biedt een manier om versleutelingssleutels, wachtwoorden en andere geheimen op te slaan met behulp van Azure en kan worden gebruikt voor het opslaan van sleutels voor Always Encrypted. Het ODBC-stuurprogramma voor SQL Server (versie 17 en hoger) bevat een ingebouwde hoofdsleutelarchiefprovider voor Azure Key Vault. De volgende verbindingsopties verwerken de Configuratie van Azure Key Vault: KeyStoreAuthentication, KeyStorePrincipalIden KeyStoreSecret.
-
KeyStoreAuthenticationkan een van de twee mogelijke tekenreekswaarden aannemen:KeyVaultPasswordenKeyVaultClientSecret. Deze waarden bepalen welk type verificatiereferenties worden gebruikt met de andere twee trefwoorden. -
KeyStorePrincipalIdneemt een tekenreeks die een identificatie vertegenwoordigt voor het account dat toegang wil krijgen tot de Azure Key Vault.- Als
KeyStoreAuthenticationis ingesteld opKeyVaultPassword, dan moetKeyStorePrincipalIdde naam zijn van een Microsoft Entra-gebruiker. - Als
KeyStoreAuthenticationis ingesteld opKeyVaultClientSecret, moetKeyStorePrincipalIdeen client-ID voor de toepassing zijn.
- Als
-
KeyStoreSecretneemt een tekenreeks die een referentiegeheim vertegenwoordigt.- Als
KeyStoreAuthenticationis ingesteld opKeyVaultPassword, moetKeyStoreSecrethet wachtwoord van de gebruiker zijn. - Als
KeyStoreAuthenticationis ingesteld opKeyVaultClientSecret, moetKeyStoreSecretde toepassingsgeheim zijn dat is gekoppeld aan de applicatie client-ID.
- Als
Alle drie de opties moeten aanwezig zijn in de verbindingsreeks om Azure Key Vault te kunnen gebruiken.
ColumnEncryption Moet ook worden ingesteld op Enabled. Als ColumnEncryption deze optie is ingesteld op Disabled maar de Opties voor Azure Key Vault aanwezig zijn, wordt het script zonder fouten voortgezet, maar wordt er geen versleuteling uitgevoerd.
In de volgende voorbeelden ziet u hoe u verbinding maakt met SQL Server met behulp van Azure Key Vault.
SQLSRV:
Een Microsoft Entra-account gebruiken:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultPassword", "KeyStorePrincipalId"=>$MSEntraUsername, "KeyStoreSecret"=>$MSEntraPassword);
$conn = sqlsrv_connect($server, $connectionInfo);
Een client-id en geheim van een Azure-toepassing gebruiken:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultClientSecret", "KeyStorePrincipalId"=>$applicationClientID, "KeyStoreSecret"=>$applicationClientSecret);
$conn = sqlsrv_connect($server, $connectionInfo);
PDO_SQLSRV: Een Microsoft Entra-account gebruiken:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultPassword; KeyStorePrincipalId = $AADUsername; KeyStoreSecret = $AADPassword;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Een client-id en geheim van een Azure-toepassing gebruiken:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultClientSecret; KeyStorePrincipalId = $applicationClientID; KeyStoreSecret = $applicationClientSecret;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Beperkingen van de PHP-stuurprogramma's bij het gebruik van Always Encrypted
SQLSRV en PDO_SQLSRV:
- Linux/macOS ondersteunen de Windows Certificate Store Provider niet
- Parameterversleuteling afdwingen
- Always Encrypted inschakelen op instructieniveau
- Wanneer u de functie Always Encrypted en niet-UTF8-landinstellingen gebruikt in Linux en macOS (zoals 'en_US. ISO-8859-1"), het invoegen van null-gegevens of een lege tekenreeks in een versleutelde tekenkolom(n) werkt mogelijk niet tenzij codepagina 1252 op uw systeem is geïnstalleerd
Alleen SQLSRV:
- Gebruiken
sqlsrv_queryvoor bindingsparameter zonder het SQL-type op te geven - Gebruiken
sqlsrv_preparevoor bindingsparameters in een batch met SQL-verklaringen
Alleen voor PDO_SQLSRV:
-
PDO::SQLSRV_ATTR_DIRECT_QUERYinstructiekenmerk opgegeven in een geparameteriseerde query -
PDO::ATTR_EMULATE_PREPAREinstructiekenmerk opgegeven in een geparameteriseerde query - bindingsparameters in een batch SQL-instructies
De PHP-stuurprogramma's nemen ook de beperkingen over die worden opgelegd door het ODBC-stuurprogramma voor SQL Server en de database. Zie beperkingen van het ODBC-stuurprogramma bij het gebruik van Always Encrypted - en Always Encrypted-beperkingen.
Zie ook
Programmeerhandleiding voor PHP SQL-stuurprogramma
Naslaginformatie over de API voor SQLSRV-stuurprogramma's
API-referentie voor de PDO_SQLSRV-driver