Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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éssqlsrv_executehasználatával kell végrehajtania egy paraméteres lekérdezést. - Állítsa be az SQL-típust explicit módon.
- 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
- 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 SQLSRV-illesztőhöz a felhasználónak két lehetősége van:
- 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éssqlsrv_execute. - Ha
sqlsrv_queryelő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.
- 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:
- PDO_SQLSRV illesztőprogram:
- Az utasításattribútum
PDO::SQLSRV_ATTR_DIRECT_QUERYparaméteres lekérdezésekben nem támogatott. - Az utasításattribútum
PDO::ATTR_EMULATE_PREPARESparaméteres lekérdezésekben nem támogatott.
- Az utasításattribútum
- SQLSRV-illesztő:
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_prepareaz SQL-típustsqlsrv_executehaszná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_queryvé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ésnumericSQL 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, vagydatetimeoffsetSQL Server-adattípusok oszlopaittimemegcé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_QUERYvagyPDO::ATTR_EMULATE_PREPARESegy 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)
ColumnEncryptionkulcsszótEnabledé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.
-
KeyStoreAuthenticationkét lehetséges sztringérték egyikét használhatja:KeyVaultPasswordésKeyVaultClientSecret. 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. -
KeyStorePrincipalIdegy 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
KeyStoreAuthenticationbe van állítvaKeyVaultPassword, akkorKeyStorePrincipalIda Microsoft Entra-felhasználó neve kell legyen. - Ha
KeyStoreAuthenticationbe van állítvaKeyVaultClientSecret, akkorKeyStorePrincipalIdaz alkalmazás ügyfél-azonosítójával kell rendelkeznie.
- Ha
-
KeyStoreSecretegy hitelesítő titkot jelképező karakterláncot fogad.- Ha
KeyStoreAuthenticationbe van állítvaKeyVaultPassword, akkorKeyStoreSecreta felhasználó jelszavának kell lennie. - Ha
KeyStoreAuthenticationbe van állítvaKeyVaultClientSecret, akkorKeyStoreSecretaz alkalmazásügyfél-azonosítóhoz társított alkalmazáskulcsnak kell lennie.
- Ha
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_queryaz SQL-típus megadása nélkül - Kötési paraméterek használata
sqlsrv_prepareSQL-utasítások kötegében
Csak a PDO_SQLSRV:
-
PDO::SQLSRV_ATTR_DIRECT_QUERYparaméteres lekérdezésben megadott utasításattribútum -
PDO::ATTR_EMULATE_PREPAREparamé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