Megosztás:


Always Encrypted használata az SQL Server PHP-illesztőprogramjaival

PHP-illesztőprogram letöltése

A

  • Microsoft illesztőprogramok 5.2 a PHP-hoz a SQL Serverhez

Bevezetés

Ez a cikk bemutatja, hogyan fejleszthet PHP-alkalmazásokat az Always Encrypted (Adatbázismotor) és az SQL Server PHP-illesztőprogramjaival.

Az Always Encrypted lehetővé teszi az ügyfélalkalmazások számára a bizalmas adatok titkosítását, és soha nem fedik fel az ADATOKAT vagy a titkosítási kulcsokat az SQL Server vagy az Azure SQL Database számára. Az Always Encrypted-kompatibilis illesztőprogramok, például az SQL Server ODBC-illesztőprogramja transzparensen titkosítják és visszafejtik a bizalmas adatokat az ügyfélalkalmazásban. Az illesztő automatikusan meghatározza, hogy mely lekérdezési paraméterek felelnek meg a bizalmas adatbázisoszlopoknak (always encrypted használatával védve), és titkosítja ezeknek a paramétereknek az értékeit, mielőtt továbbítanák az adatokat az SQL Servernek vagy az Azure SQL Database-nek. Hasonlóképpen, az illesztőprogram transzparensen visszafejti a titkosított adatbázis oszlopaiból lekért adatokat a lekérdezési eredményekben. További információ: Always Encrypted (Adatbázismotor). Az SQL Server PHP-illesztőprogramjai az SQL Server ODBC-illesztőprogramjának használatával titkosítják a bizalmas adatokat.

Előfeltételek

  • Konfigurálja az Always Encryptedt az adatbázisban. Ez a konfiguráció magában foglalja az Always Encrypted kulcsok kiépítését és a kijelölt adatbázisoszlopok titkosításának beállítását. Ha még nem rendelkezik Always Encrypteddel konfigurált adatbázissal, kövesse az oktatóanyag útmutatását : Az Always Encrypted használatának első lépései. Az adatbázisnak különösen tartalmaznia kell egy oszlopmintakulcs (CMK), egy oszloptitkosítási kulcs (CEK) metaadat-definícióit, valamint egy olyan táblát, amely egy vagy több, a CEK használatával titkosított oszlopot tartalmaz.
  • Győződjön meg arról, hogy az SQL Server 17-es vagy újabb verziójához készült ODBC-illesztőprogram telepítve van a fejlesztői gépen. További részletekért tekintse meg az SQL Server ODBC-illesztőjét.

Always Encrypted engedélyezése PHP-alkalmazásban

A titkosított oszlopokat megcélzó paraméterek titkosításának és a lekérdezési eredmények visszafejtésének legegyszerűbb módja a kapcsolati sztring kulcsszó ColumnEncryptionértékének Enabled beállítása. Az alábbi példák az Always Encrypted SQLSRV-ben és PDO_SQLSRV illesztőprogramokban való engedélyezésére használhatók:

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

Az Always Encrypted engedélyezése önmagában nem elegendő a titkosítás vagy a visszafejtés sikerességéhez; győződjön meg arról is, hogy:

  • Az alkalmazás rendelkezik a VIEW ANY COLUMN MASTER KEY DEFINITION és VIEW ANY COLUMN ENCRYPTION KEY DEFINITION adatbázis engedélyekkel, amely az adatbázisban lévő Always Encrypted kulcsok metaadatainak eléréséhez szükséges. További részletekért lásd: Adatbázis-engedély.
  • Az alkalmazás hozzáférhet a lekérdezett titkosított oszlopok CEK-jait védő CMK-hoz. Ez a követelmény a CMK-t tároló kulcstároló szolgáltatótól függ. További információ: Az oszlop főkulcstárolóinak használata.

Adatok beolvasása és módosítása titkosított oszlopokban

Miután engedélyezte az Always Encrypted szolgáltatást egy kapcsolaton, szabványos SQLSRV API-k (lásd : SQLSRV Driver API-referencia) vagy PDO_SQLSRV API-k (lásd PDO_SQLSRV Driver API-referencia) használatával lekérheti vagy módosíthatja az adatokat titkosított adatbázisoszlopokban. Feltételezve, hogy az alkalmazás rendelkezik a szükséges adatbázis-engedélyekkel, és hozzáfér az oszlop főkulcsához, az illesztő titkosítja a titkosított oszlopokat megcélzó és a titkosított oszlopokból lekért adatok visszafejtését célzó lekérdezési paramétereket, és transzparens módon viselkedik az alkalmazás számára, mintha az oszlopok nem lettek volna titkosítva.

Ha az Always Encrypted nincs engedélyezve, a titkosított oszlopokat megcélzott paraméterekkel rendelkező lekérdezések sikertelenek. Az adatok továbbra is lekérhetők titkosított oszlopokból, amennyiben a lekérdezés nem tartalmaz titkosított oszlopokat célzó paramétereket. Az illesztőprogram azonban nem kísérli meg a visszafejtést, és az alkalmazás megkapja a bináris titkosított adatokat (bájttömbökként).

Az alábbi táblázat a lekérdezések viselkedését foglalja össze attól függően, hogy az Always Encrypted engedélyezve van-e, vagy sem:

Lekérdezési jellemző Az Always Encrypted engedélyezve van, és az alkalmazás hozzáférhet a kulcsokhoz és a kulcs metaadataihoz Az Always Encrypted engedélyezve van, és az alkalmazás nem tudja elérni a kulcsokat vagy a kulcs metaadatait Az "Always Encrypted" funkció le van tiltva.
Titkosított oszlopokat célzó paraméterek. A paraméterértékek transzparensen titkosítva vannak. Error Error
Adatok lekérése titkosított oszlopokból, a titkosított oszlopokat célzó paraméterek nélkül. A titkosított oszlopok eredményei transzparensen visszafejthetők. Az alkalmazás egyszerű szöveges oszlopértékeket fogad. Error A titkosított oszlopok eredményei nem lesznek visszafejtve. Az alkalmazás bájttömbökként kapja meg a titkosított értékeket.

Az alábbi példák az adatok titkosított oszlopokban való beolvasását és módosítását szemléltetik. A példák a következő sémával rendelkező táblát feltételezik. Az SSN- és BirthDate-oszlopok titkosítva vannak.

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élda adatszúrásra

Az alábbi példák bemutatják, hogyan lehet az SQLSRV és PDO_SQLSRV illesztők használatával beszúrni egy sort a Patient táblába. Jegyezze fel a következő pontokat:

  • A mintakód nem tartalmaz titkosítást. Az illesztőprogram automatikusan észleli és titkosítja az SSN- és BirthDate-paraméterek értékeit, amelyek titkosított oszlopokat céloznak meg. Ez a mechanizmus transzparenssé teszi a titkosítást az alkalmazás számára.
  • Az adatbázisoszlopokba beszúrt értékek, beleértve a titkosított oszlopokat is, kötött paraméterekként lesznek átadva. A paraméterek használata nem kötelező, ha az értékeket nem titkosított oszlopokba küldi (bár erősen ajánlott, mert segít megelőzni az SQL-injektálást), a titkosított oszlopokat megcélzó értékekhez szükséges. Ha az SSN- vagy BirthDate-oszlopokba beszúrt értékeket a lekérdezési utasításba beágyazott literálként adná át, a lekérdezés meghiúsulna, mert az illesztőprogram nem próbálja meg a lekérdezésekben lévő literálok titkosítását vagy más módon történő feldolgozását. Ennek eredményeképpen a kiszolgáló elutasítja őket, mivel nem kompatibilisek a titkosított oszlopokkal.
  • Ha kötési paraméterekkel szúr be értékeket, a céloszlop adattípusával azonos VAGY a céloszlop adattípusára való konvertálást támogató SQL-típust kell átadni az adatbázisnak. Ennek a követelménynek az az oka, hogy az Always Encrypted kevés típuskonverziót támogat (a részletekért lásd: Always Encrypted (Adatbázismotor). A két PHP-illesztő, az SQLSRV és a PDO_SQLSRV mindegyike rendelkezik egy olyan mechanizmussal, amellyel a felhasználó meghatározhatja az érték SQL-típusát. Ezért a felhasználónak nem kell explicit módon megadnia az SQL-típust.
    • Az SQLSRV-illesztőhöz a felhasználónak két lehetősége van:
      • A MEGFELELŐ SQL-típus meghatározásához és beállításához támaszkodjon a PHP-illesztőre. Ebben az esetben a felhasználónak a sqlsrv_prepare és sqlsrv_execute használatával kell végrehajtania egy paraméteres lekérdezést.
      • Állítsa be az SQL-típust explicit módon.
    • A PDO_SQLSRV illesztőprogram esetében a felhasználó nem tudja explicit módon beállítani a paraméter SQL-típusát. A PDO_SQLSRV illesztő automatikusan segít a felhasználónak meghatározni az SQL-típust egy paraméter kötésekor.
  • Az illesztőprogramok az SQL-típus meghatározásához néhány korlátozást alkalmaznak:
    • SQLSRV-illesztő:
      • Ha a felhasználó azt szeretné, hogy az illesztőprogram határozza meg a titkosított oszlopok SQL-típusait, a felhasználónak a következőt kell használnia: sqlsrv_prepare és sqlsrv_execute.
      • Ha sqlsrv_query előnyben részesítik, a felhasználó felelős az SQL-típusok megadásáért az összes paraméterhez. A megadott SQL-típusnak tartalmaznia kell a sztringek hosszát a sztringtípusokhoz, valamint a decimális típusok skálázását és pontosságát.
    • PDO_SQLSRV illesztőprogram:
      • Az utasításattribútum PDO::SQLSRV_ATTR_DIRECT_QUERY paraméteres lekérdezésekben nem támogatott.
      • Az utasításattribútum PDO::ATTR_EMULATE_PREPARES paraméteres lekérdezésekben nem támogatott.

SQLSRV-illesztő és 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-illesztő és 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 illesztőprogram és 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();

Egyszerű szöveges adatlekérési példa

Az alábbi példák bemutatják, hogy titkosított értékek alapján szűrik az adatokat, és egyszerű szöveges adatokat keresnek a titkosított oszlopokból az SQLSRV és PDO_SQLSRV illesztőprogramok használatával. Jegyezze fel a következő pontokat:

  • A WHERE záradékban az SSN-oszlop szűréséhez használt értéket kötési paraméterrel kell átadni, hogy az illesztőprogram transzparensen titkosíthassa, mielőtt elküldené azt a kiszolgálónak.
  • Kötött paraméterekkel rendelkező lekérdezés végrehajtásakor a PHP-illesztőprogramok automatikusan meghatározzák a felhasználó SQL-típusát, kivéve, ha a felhasználó kifejezetten megadja az SQL-típust az SQLSRV-illesztő használatakor.
  • A program által kinyomtatott összes érték egyszerű szöveges, mivel az illesztőprogram transzparensen visszafejti az SSN és a BirthDate oszlopokból lekért adatokat.

Megjegyzés:

A lekérdezések csak akkor végezhetnek egyenlőség-összehasonlítást a titkosított oszlopokon, ha a titkosítás determinisztikus.

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

A rejtjelezett adat visszanyerés példája

Ha az Always Encrypted nincs engedélyezve, a lekérdezések továbbra is lekérhetik az adatokat titkosított oszlopokból, feltéve, hogy a lekérdezés nem tartalmaz titkosított oszlopokat célzó paramétereket.

Az alábbi példák azt szemléltetik, hogy binárisan titkosított adatokat kell lekérni a titkosított oszlopokból az SQLSRV és PDO_SQLSRV illesztőprogramok használatával. Jegyezze fel a következő pontokat:

  • Mivel az Always Encrypted nincs engedélyezve a kapcsolati sztringben, a lekérdezés az SSN és a BirthDate titkosított értékeit adja vissza bájttömbökként (a program sztringekké alakítja az értékeket).
  • Az Always Encrypted letiltott titkosított oszlopaiból adatokat lekérő lekérdezésnek lehetnek paraméterei, feltéve, hogy egyik paraméter sem céloz meg titkosított oszlopot. A következő lekérdezés a LastName szerint szűr, amely nincs titkosítva az adatbázisban. Ha a lekérdezés SSN vagy BirthDate szerint szűr, a lekérdezés sikertelen lesz.

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

A titkosított oszlopok lekérdezésével kapcsolatos gyakori problémák elkerülése

Ez a szakasz a PHP-alkalmazásokból származó titkosított oszlopok lekérdezésekor előforduló gyakori hibakategóriákat, valamint néhány, az elkerülésükre vonatkozó útmutatást ismerteti.

Nem támogatott adattípus-konverziós hibák

Az Always Encrypted kevés konverziót támogat a titkosított adattípusokhoz. A támogatott típuskonverziók részletes listáját az Always Encrypted (adatbázismotor) című témakörben találja. Az adattípusok konvertálási hibáinak elkerülése érdekében tegye a következőket:

  • Ha az SQLSRV-illesztőt és sqlsrv_prepare az SQL-típust sqlsrv_execute használja, az oszlopméret és a paraméter tizedesjegyeinek száma automatikusan meg lesz határozva.
  • Amikor a PDO_SQLSRV illesztőt használja egy lekérdezés végrehajtásához, a rendszer automatikusan meghatározza az oszlopmérettel és a paraméter tizedesjegyeinek számával rendelkező SQL-típust is.
  • Ha az SQLSRV-illesztőt lekérdezés sqlsrv_query végrehajtásához használja:
    • A paraméter SQL-típusa pontosan megegyezik a megcélzott oszlop típusával, vagy az SQL-típusról az oszlop típusára való konvertálás támogatott.
    • Az decimal és numeric SQL Server-adattípusokra vonatkozó paraméterek pontossága és mértéke megegyezik a céloszlop beállított pontosságával és léptékével.
    • A céloszlopot módosító lekérdezésekben az , datetime2, vagy datetimeoffset SQL Server-adattípusok oszlopait timemegcélzó paraméterek pontossága nem nagyobb, mint a céloszlop pontossága.
  • Ne használjon PDO_SQLSRV utasításattribútumokat PDO::SQLSRV_ATTR_DIRECT_QUERY vagy PDO::ATTR_EMULATE_PREPARES egy paraméteres lekérdezésben

A titkosított értékek helyett egyszerű szöveg átadása miatti hibák

Minden olyan értéket, amely egy titkosított oszlopot céloz meg, titkosítva kell lennie, mielőtt elküldené őket a kiszolgálónak. Ha egy titkosított oszlop egyszerű szöveges értéke alapján próbál meg beszúrni, módosítani vagy szűrni, az hibát eredményez. Az ilyen hibák elkerülése érdekében győződjön meg arról, hogy:

  • Az Always Encrypted engedélyezve van (a kapcsolati láncban állítsa a(z) ColumnEncryption kulcsszót Enabled értékre).
  • A kötési paraméter használatával titkosított oszlopokat célzó adatokat küldhet. Az alábbi példa egy olyan lekérdezést mutat be, amely helytelenül szűr egy konstans/állandó alapján egy titkosított oszlopon (SSN):
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";

Az Always Encrypted teljesítményhatásának szabályozása

Mivel az Always Encrypted egy ügyféloldali titkosítási technológia, a teljesítményterhelés nagy része az ügyféloldalon figyelhető meg, nem az adatbázisban. A titkosítási és visszafejtési műveletek költségein kívül az ügyféloldali teljesítmény egyéb többletterhelési forrásai a következők:

  • További ciklikus utak az adatbázisba a lekérdezési paraméterek metaadatainak lekéréséhez.
  • Egy oszlop főkulcstárának hívása az oszlop főkulcsának eléréséhez.

Adatletöltési ciklusok a lekérdezési paraméterek metaadatainak lekéréséhez

Ha az Always Encrypted engedélyezve van egy kapcsolathoz, az ODBC-illesztő alapértelmezés szerint meghívja sys.sp_describe_parameter_encryption minden paraméteres lekérdezéshez, és átadja a lekérdezési utasítást (paraméterértékek nélkül) az SQL Servernek. Ez a tárolt eljárás elemzi a lekérdezési utasítást annak kiderítéséhez, hogy szükséges-e a paraméterek titkosítása, és ha igen, az egyes paraméterek titkosítással kapcsolatos adatait adja vissza, hogy az illesztőprogram titkosíthassa őket.

Mivel a PHP-illesztőprogramok lehetővé teszik a felhasználó számára, hogy egy előkészített utasításban kössön egy paramétert az SQL-típus megadása nélkül, a paraméter Always Encrypted-kompatibilis kapcsolaton való kötésekor a PHP-illesztőprogramok meghívják az SQLDescribeParam paramétert az SQL-típus, az oszlopméret és a tizedesjegyek lekéréséhez. A metaadatok ezután az SQLBindParameter meghívására szolgálnak. Ezek az extra SQLDescribeParam hívások nem igényelnek további kéréseket az adatbázishoz, mivel az ODBC-illesztőprogram már eltárolta az információt az ügyféloldalon, amikor a sys.sp_describe_parameter_encryption hívás megtörtént.

Az előző viselkedések biztosítják az ügyfélalkalmazás (és az alkalmazásfejlesztő) számára a magas szintű átláthatóságot, és nem kell tudnia, hogy mely lekérdezések férnek hozzá a titkosított oszlopokhoz, amíg a titkosított oszlopokat megcélzó értékeket a rendszer átadja az illesztőprogramnak a paraméterekben.

Az SQL Server ODBC-illesztőprogramjaival ellentétben az Always Encrypted engedélyezése az utasítás/lekérdezés szintjén még nem támogatott a PHP-illesztőprogramokban.

Oszloptitkosítási kulcs gyorsítótárazása

Az oszloptitkosítási kulcsok (CEK) visszafejtéséhez az oszlop főkulcstárolójába irányuló hívások számának csökkentése érdekében az illesztőprogram gyorsítótárazza az egyszerű szöveges CEK-okat a memóriában. Miután megkapta a titkosított CEK-et (ECEK) az adatbázis metaadataiból, az ODBC-illesztő először megpróbálja megtalálni a gyorsítótár titkosított kulcsértékének megfelelő egyszerű szöveges CEK-et. Az illesztőprogram csak akkor hívja meg a CMK-t tartalmazó kulcstárolót, ha nem találja a megfelelő egyszerű szöveges CEK-et a gyorsítótárban.

Megjegyzés: Az SQL Server ODBC-illesztőjében a gyorsítótár bejegyzései kétórás időtúllépés után törlődnek. Ez a viselkedés azt jelenti, hogy egy adott ECEK esetében az illesztőprogram csak egyszer lép kapcsolatba a kulcstárolóval az alkalmazás élettartama alatt, vagy két óránként, attól függően, hogy melyik kevesebb.

Az oszlop főkulcstárolóinak használata

Az adatok titkosításához vagy visszafejtéséhez az illesztőprogramnak be kell szereznie a céloszlophoz konfigurált CEK-et. A CEK-k titkosított formában (ECEK-k) vannak tárolva az adatbázis metaadataiban. Minden CEK rendelkezik egy megfelelő CMK-val, amelyet a titkosításhoz használtak. Az adatbázis metaadatai nem tárolják a CMK-t; csak a kulcstároló nevét és a kulcstároló által a CMK megkereséséhez használható információkat tartalmazza.

Az ECEK egyszerű szöveges értékének lekéréséhez az illesztő először a CEK-ről és annak megfelelő CMK-járól is lekéri a metaadatokat, majd ezen információk alapján kapcsolatba lép a CMK-t tartalmazó kulcstárolóval, és kéri, hogy fejtse vissza az ECEK-et. Az illesztőprogram egy kulcstároló-szolgáltató használatával kommunikál egy kulcstárolóval.

Az SQL Server PHP-hez készült Microsoft Driver 5.3.0-s verziójában csak a Windows tanúsítványtároló-szolgáltató és az Azure Key Vault támogatott. Az ODBC-illesztőprogram (egyéni kulcstár-szolgáltató) által támogatott másik keystore-szolgáltató még nem támogatott.

A Windows tanúsítványtároló-szolgáltató használata

A Windows rendszeren futó SQL Server ODBC-illesztőprogramja tartalmaz egy beépített főkulcstároló-szolgáltatót az oszlopok számára a Windows Tanúsítványtárolóhoz, amelynek neve MSSQL_CERTIFICATE_STORE. (Ez a szolgáltató nem érhető el macOS vagy Linux rendszeren.) Ezzel a szolgáltatóval a CMK helyben van tárolva az ügyfélszámítógépen, és az alkalmazásnak nincs más konfigurációja az illesztőprogrammal való használatához. Az alkalmazásnak azonban hozzá kell férnie a tanúsítványhoz és annak titkos kulcsához az áruházban. További információ: Oszlop főkulcsainak létrehozása és tárolása (Always Encrypted)

Az Azure Key Vault használata

Az Azure Key Vault lehetővé teszi a titkosítási kulcsok, jelszavak és egyéb titkos kódok tárolását az Azure használatával, és használható az Always Encrypted kulcsainak tárolására. Az SQL Server ODBC-illesztőprogramja (17-es vagy újabb verzió) tartalmaz egy beépített főkulcstár-szolgáltatót az Azure Key Vaulthoz. A következő kapcsolati lehetőségek kezelik az Azure Key Vault konfigurációját: KeyStoreAuthentication, KeyStorePrincipalIdés KeyStoreSecret.

  • KeyStoreAuthentication két lehetséges sztringérték egyikét használhatja: KeyVaultPassword és KeyVaultClientSecret. Ezek az értékek szabályozzák, hogy milyen hitelesítési hitelesítő adatokat használ a rendszer a másik két kulcsszóval.
  • KeyStorePrincipalId egy karakterláncot vesz fel, amely a hozzáférni kívánó fiók azonosítóját képviseli az Azure Key Vault eléréséhez.
    • Ha KeyStoreAuthentication be van állítva KeyVaultPassword, akkor KeyStorePrincipalId a Microsoft Entra-felhasználó neve kell legyen.
    • Ha KeyStoreAuthentication be van állítva KeyVaultClientSecret, akkor KeyStorePrincipalId az alkalmazás ügyfél-azonosítójával kell rendelkeznie.
  • KeyStoreSecret egy hitelesítő titkot jelképező karakterláncot fogad.
    • Ha KeyStoreAuthentication be van állítva KeyVaultPassword, akkor KeyStoreSecret a felhasználó jelszavának kell lennie.
    • Ha KeyStoreAuthentication be van állítva KeyVaultClientSecret, akkor KeyStoreSecret az alkalmazásügyfél-azonosítóhoz társított alkalmazáskulcsnak kell lennie.

Az Azure Key Vault használatához mindhárom lehetőségnek szerepelnie kell a kapcsolati sztringben. ColumnEncryption Emellett be kell állítani a következőtEnabled: . Ha ColumnEncryption be van állítva Disabled , de az Azure Key Vault beállításai meg vannak adva, a szkript hiba nélkül folytatódik, de nem történik titkosítás.

Az alábbi példák bemutatják, hogyan csatlakozhat az SQL Serverhez az Azure Key Vault használatával.

SQLSRV:

Microsoft Entra-fiók használata:

$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultPassword", "KeyStorePrincipalId"=>$MSEntraUsername, "KeyStoreSecret"=>$MSEntraPassword);
$conn = sqlsrv_connect($server, $connectionInfo);

Azure-alkalmazás ügyfélazonosító és titkos kód használata:

$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultClientSecret", "KeyStorePrincipalId"=>$applicationClientID, "KeyStoreSecret"=>$applicationClientSecret);
$conn = sqlsrv_connect($server, $connectionInfo);

PDO_SQLSRV: Microsoft Entra-fiók használata:

$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultPassword; KeyStorePrincipalId = $AADUsername; KeyStoreSecret = $AADPassword;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);

Azure alkalmazás ügyfél-azonosító és titkos jelszó:

$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultClientSecret; KeyStorePrincipalId = $applicationClientID; KeyStoreSecret = $applicationClientSecret;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);

A PHP-illesztőprogramok korlátozásai az Always Encrypted használatakor

SQLSRV és PDO_SQLSRV:

  • A Linux/macOS nem támogatja a Windows tanúsítványtároló-szolgáltatót
  • Paramétertitkosítás kényszerítése
  • Az Always Encrypted engedélyezése az utasítás szintjén
  • Az Always Encrypted funkció és a nem UTF8-alapú területi beállítások használata esetén Linux és macOS rendszeren (például "en_US. ISO-8859-1"), ha null adatokat vagy üres sztringet szúr be egy titkosított karakter(n) oszlopba, előfordulhat, hogy nem működik, kivéve, ha az 1252-es kódlap telepítve van a rendszeren

Csak SQLSRV:

  • Kötési paraméter használata sqlsrv_query az SQL-típus megadása nélkül
  • Kötési paraméterek használata sqlsrv_prepare SQL-utasítások kötegében

Csak a PDO_SQLSRV:

  • PDO::SQLSRV_ATTR_DIRECT_QUERY paraméteres lekérdezésben megadott utasításattribútum
  • PDO::ATTR_EMULATE_PREPARE paraméteres lekérdezésben megadott utasításattribútum
  • kötési paraméterek sql-utasítások kötegében

A PHP-illesztőprogramok az SQL Server és az adatbázis ODBC-illesztőprogramja által előírt korlátozásokat is öröklik. Lásd az ODBC-illesztőprogram korlátozásait az Always Encrypted és az Always Encrypted korlátozások használatakor.

Lásd még

Programozási útmutató PHP SQL Driverhez
SQLSRV Driver API-referencia
PDO_SQLSRV Driver API-referencia