Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Geçerli olan
- SQL Server için PHP için Microsoft Drivers 5.2
Giriş
Bu makale , Always Encrypted (Veritabanı Altyapısı) ve SQL Server için PHP Sürücüleri kullanarak PHP uygulamaları geliştirme hakkında bilgi sağlar.
Always Encrypted, istemci uygulamalarının hassas verileri şifrelemesine ve verileri veya şifreleme anahtarlarını SQL Server veya Azure SQL Veritabanı'na hiçbir zaman göstermemesini sağlar. SQL Server için ODBC Sürücüsü gibi Always Encrypted özellikli bir sürücü, istemci uygulamasındaki hassas verileri saydam bir şekilde şifreler ve şifresini çözer. Sürücü, hassas veritabanı sütunlarına hangi sorgu parametrelerinin karşılık olduğunu otomatik olarak belirler (Always Encrypted kullanılarak korunur) ve verileri SQL Server'a veya Azure SQL Veritabanı'na geçirmeden önce bu parametrelerin değerlerini şifreler. Benzer şekilde, sürücü sorgu sonuçlarında şifrelenmiş veritabanı sütunlarından alınan verilerin şifresini saydam bir şekilde çözer. Daha fazla bilgi için bkz . Always Encrypted (Veritabanı Altyapısı). SQL Server'ın PHP Sürücüleri, hassas verileri şifrelemek için SQL Server için ODBC Sürücüsünü kullanır.
Önkoşullar
- Veritabanınızda Always Encrypted'ı yapılandırın. Bu yapılandırma Always Encrypted anahtarlarını sağlamayı ve seçili veritabanı sütunları için şifrelemeyi ayarlamayı içerir. Always Encrypted yapılandırılmış bir veritabanınız yoksa Öğretici: Always Encrypted'ı kullanmaya başlama başlığı altındaki yönergeleri izleyin. Özellikle veritabanınız bir Sütun Ana Anahtarı (CMK), Sütun Şifreleme Anahtarı (CEK) için meta veri tanımlarını ve bu CEK kullanılarak şifrelenmiş bir veya daha fazla sütunu içeren bir tablo içermelidir.
- Geliştirme makinenizde SQL Server için ODBC Sürücüsü'nün sürüm 17 veya daha üstünün yüklü olduğundan emin olun. Ayrıntılar için bkz. SQL Server için ODBC Sürücüsü.
BIR PHP uygulamasında Always Encrypted'i etkinleştirme
Şifrelenmiş sütunları hedefleyen parametrelerin şifrelenmesini ve sorgu sonuçlarının şifresinin çözülmesini etkinleştirmenin en kolay yolu, bağlantı dizesi anahtar sözcüğü değerini ColumnEncryption olarak Enabledayarlamaktır. SqlSRV ve PDO_SQLSRV sürücülerinde Always Encrypted'ı etkinleştirme örnekleri aşağıda verilmiştir:
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);
Always Encrypted'ın etkinleştirilmesi şifrelemenin veya şifre çözmenin başarılı olması için yeterli değildir; ayrıca şunları da yapmanız gerekir:
- Uygulama, veritabanındaki Always Encrypted anahtarları hakkındaki meta verilere erişmek için gereken HERHANGİ Bİr SÜTUN ANA ANAHTAR TANIMI GÖRÜNTÜLE ve HERHANGİ Bİr SÜTUN ŞIFRELEME ANAHTAR TANIMINI GÖRÜNTÜLE veritabanı izinlerine sahiptir. Ayrıntılar için bkz. Veritabanı İzni.
- Uygulama, sorgulanan şifrelenmiş sütunlar için CEK'leri koruyan CMK'ye erişebilir. Bu gereksinim, CMK'yi depolayan anahtar deposu sağlayıcısına bağlıdır. Daha fazla bilgi için bkz. Sütun Ana Anahtar Depolarıyla Çalışma.
Şifrelenmiş sütunlardaki verileri alma ve değiştirme
Bir bağlantıda Always Encrypted'ı etkinleştirdikten sonra, şifrelenmiş veritabanı sütunlarındaki verileri almak veya değiştirmek için standart SQLSRV API'lerini (bkz. SQLSRV Sürücü API Başvurusu) veya PDO_SQLSRV API'lerini (bkz . PDO_SQLSRV Sürücü API'si Başvurusu) kullanabilirsiniz. Uygulamanızın gerekli veritabanı izinlerine sahip olduğunu ve sütun ana anahtarına erişebildiğini varsayarsak, sürücü şifrelenmiş sütunları hedefleyen tüm sorgu parametrelerini şifreler ve şifrelenmiş sütunlardan alınan verilerin şifresini çözer ve sütunlar şifrelenmemiş gibi uygulamaya saydam davranır.
Always Encrypted etkin değilse, şifrelenmiş sütunları hedefleyen parametrelere sahip sorgular başarısız olur. Sorguda şifrelenmiş sütunları hedefleyen parametre olmadığı sürece veriler şifrelenmiş sütunlardan alınabilir. Ancak sürücü herhangi bir şifre çözme girişiminde bulunmaz ve uygulama ikili şifrelenmiş verileri (bayt dizileri olarak) alır.
Aşağıdaki tabloda, Always Encrypted'ın etkinleştirilip etkinleştirilmediğine bağlı olarak sorguların davranışı özetlenir:
| Sorgu özelliği | Always Encrypted etkindir ve uygulama anahtarlara ve anahtar meta verilerine erişebilir | Always Encrypted etkindir ve uygulama anahtarlara veya anahtar meta verilerine erişemez | Always Encrypted devre dışı |
|---|---|---|---|
| Şifrelenmiş sütunları hedefleyen parametreler. | Parametre değerleri saydam olarak şifrelenir. | Hata | Hata |
| Şifrelenmiş sütunları hedefleyen parametreler olmadan şifrelenmiş sütunlardan veri alma. | Şifrelenmiş sütunlardan elde edilen sonuçların şifresi saydam olarak çözülür. Uygulama düz metin sütun değerlerini alır. | Hata | Şifrelenmiş sütunlardan elde edilen sonuçların şifresi çözülmez. Uygulama, şifrelenmiş değerleri bayt dizileri olarak alır. |
Aşağıdaki örneklerde şifrelenmiş sütunlardaki verilerin alınması ve değiştirilmesi gösterilmektedir. Örneklerde aşağıdaki şemaya sahip bir tablo varsayılır. SSN ve BirthDate sütunları şifrelenir.
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
Veri ekleme örneği
Aşağıdaki örneklerde, Patient tablosuna satır eklemek için SQLSRV ve PDO_SQLSRV sürücülerinin nasıl kullanılacağı gösterilmektedir. Aşağıdaki noktaları not edin:
- Örnek kodda şifrelemeye özgü bir şey yoktur. Sürücü, şifrelenmiş sütunları hedefleyen SSN ve BirthDate parametrelerinin değerlerini otomatik olarak algılar ve şifreler. Bu mekanizma, şifrelemeyi uygulama için saydam hale getirir.
- Şifrelenmiş sütunlar da dahil olmak üzere veritabanı sütunlarına eklenen değerler ilişkili parametreler olarak geçirilir. Parametrelerin kullanılması, şifrelenmemiş sütunlara değer gönderirken isteğe bağlıdır (SQL eklemenin önlenmesine yardımcı olduğu için kesinlikle önerilir), şifrelenmiş sütunları hedefleyen değerler için gereklidir. SSN veya BirthDate sütunlarına eklenen değerler sorgu deyimine eklenmiş değişmez değerler olarak geçirildiyse, sürücü sorgulardaki değişmez değerleri şifrelemeye veya başka bir şekilde işlemeye çalışmadığından sorgu başarısız olur. Sonuç olarak, sunucu bunları şifrelenmiş sütunlarla uyumsuz olarak reddeder.
- Bağlama parametrelerini kullanarak değer eklerken, hedef sütunun veri türüyle aynı olan veya hedef sütunun veri türüne dönüştürmesi desteklenen bir SQL türü veritabanına geçirilmelidir. Bunun nedeni, Always Encrypted'ın birkaç tür dönüştürmeyi desteklemesidir (ayrıntılar için bkz . Always Encrypted (Veritabanı Altyapısı)). SQLSRV ve PDO_SQLSRV olmak üzere iki PHP sürücüsünün her biri, kullanıcının değerin SQL türünü belirlemesine yardımcı olacak bir mekanizmaya sahiptir. Bu nedenle, kullanıcının SQL türünü açıkça sağlaması gerekmez.
- SQLSRV sürücüsü için kullanıcının iki seçeneği vardır:
- Doğru SQL türünü belirlemek ve ayarlamak için PHP sürücüsüne güvenin. Bu durumda, kullanıcının parametreli bir sorgu yürütmek için
sqlsrv_preparevesqlsrv_executekullanması gerekir. - SQL türünü açıkça ayarlayın.
- Doğru SQL türünü belirlemek ve ayarlamak için PHP sürücüsüne güvenin. Bu durumda, kullanıcının parametreli bir sorgu yürütmek için
- PDO_SQLSRV sürücüsü için kullanıcı bir parametrenin SQL türünü açıkça ayarlayamaz. PDO_SQLSRV sürücüsü, bir parametreyi bağlarken kullanıcının SQL türünü otomatik olarak belirlemesine yardımcı olur.
- SQLSRV sürücüsü için kullanıcının iki seçeneği vardır:
- Sürücülerin SQL türünü belirlemesi için bazı sınırlamalar geçerlidir:
- SQLSRV Sürücüsü:
- Kullanıcı, sürücünün şifrelenmiş sütunlar için SQL türlerini belirlemesini istiyorsa
sqlsrv_preparevesqlsrv_executekullanmalıdır. - Tercih edilirse
sqlsrv_query, kullanıcı tüm parametreler için SQL türlerini belirtmekle sorumludur. Belirtilen SQL türü, dize türleri için dize uzunluğunu ve ondalık türleri için ölçeği ve duyarlığı içermelidir.
- Kullanıcı, sürücünün şifrelenmiş sütunlar için SQL türlerini belirlemesini istiyorsa
- PDO_SQLSRV Sürücüsü:
- Deyim özniteliği
PDO::SQLSRV_ATTR_DIRECT_QUERYparametreli sorguda desteklenmez. - Deyim özniteliği
PDO::ATTR_EMULATE_PREPARESparametreli sorguda desteklenmez.
- Deyim özniteliği
- SQLSRV Sürücüsü:
SQLSRV sürücüsü ve 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 sürücüsü ve 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 sürücüsü ve 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();
Düz metin veri alma örneği
Aşağıdaki örnekler, şifrelenmiş değerlere göre verileri filtrelemeyi ve SQLSRV ve PDO_SQLSRV sürücülerini kullanarak şifrelenmiş sütunlardan düz metin verileri almayı gösterir. Aşağıdaki noktaları not edin:
- SSN sütununa filtre uygulamak için WHERE yan tümcesinde kullanılan değerin, sürücünün sunucuya göndermeden önce saydam bir şekilde şifreleyebilmesi için bağlama parametresi kullanılarak geçirilmesi gerekir.
- Bağlı parametrelerle bir sorgu yürütürken, kullanıcı SQLSRV sürücüsünü kullanırken SQL türünü açıkça belirtmediği sürece, PHP sürücüleri kullanıcının SQL türünü otomatik olarak belirler.
- Sürücü SSN ve BirthDate sütunlarından alınan verilerin şifresini saydam bir şekilde çözeceğinden, program tarafından yazdırılan tüm değerler düz metin biçimindedir.
Uyarı
Sorgular yalnızca şifreleme belirleyici olduğunda şifrelenmiş sütunlarda eşitlik karşılaştırmaları gerçekleştirebilir.
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();
Şifreleme metni veri alma örneği
Always Encrypted etkinleştirilmemişse, sorgu şifrelenmiş sütunları hedefleyen parametreleri olmadığı sürece, sorgu şifrelenmiş sütunlardan verileri almaya devam edebilir.
Aşağıdaki örneklerde SQLSRV ve PDO_SQLSRV sürücüleri kullanılarak şifrelenmiş sütunlardan ikili şifrelenmiş verilerin alınması gösterilmektedir. Aşağıdaki noktaları not edin:
- Bağlantı dizesinde Always Encrypted etkinleştirilmediğinden, sorgu bayt dizileri olarak SSN ve DoğumTarihi'nin şifrelenmiş değerlerini döndürür (program değerleri dizelere dönüştürür).
- Always Encrypted devre dışı bırakılmış şifrelenmiş sütunlardan veri alan sorgunun parametreleri olabilir, ancak parametrelerin hiçbiri şifrelenmiş bir sütunu hedeflemez. Aşağıdaki sorgu LastName'e göre filtrelenir ve bu filtre veritabanında şifrelenmez. Sorgu SSN veya BirthDate tarafından filtrelenirse sorgu başarısız olur.
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();
Şifrelenmiş sütunları sorgularken sık karşılaşılan sorunlardan kaçınma
Bu bölümde, PHP uygulamalarından şifrelenmiş sütunları sorgularken karşılaşılan yaygın hata kategorileri ve bunların nasıl önlenmeleri gerektiğiyle ilgili birkaç yönerge açıklanmaktadır.
Desteklenmeyen veri türü dönüştürme hataları
Always Encrypted, şifrelenmiş veri türleri için birkaç dönüştürmeyi destekler. Desteklenen tür dönüştürmelerinin ayrıntılı listesi için bkz . Always Encrypted (Veritabanı Altyapısı ). Veri türü dönüştürme hatalarını önlemek için aşağıdakileri yapın:
- SQLSRV sürücüsü ile ve
sqlsrv_prepareSQL türüylesqlsrv_executebirlikte kullanıldığında, sütun boyutu ve parametrenin ondalık basamak sayısı otomatik olarak belirlenir. - Sorguyu yürütmek için PDO_SQLSRV sürücüsünü kullanırken, sütun boyutuna ve parametrenin ondalık basamak sayısına sahip SQL türü de otomatik olarak belirlenir
- Ile SQLSRV sürücüsünü
sqlsrv_querykullanarak sorgu yürütürken:- Parametrenin SQL türü, hedeflenen sütunun türüyle tamamen aynıdır veya SQL türünden sütunun türüne dönüştürme desteklenir.
-
decimalvenumericSQL Server veri türlerinin sütunlarını hedefleyen parametrelerin duyarlığı ve ölçeği, hedef sütun için yapılandırılan duyarlık ve ölçek ile aynıdır. -
datetime2,datetimeoffsetveyatimeSQL Server veri türlerinin sütunlarına yönelik parametrelerin duyarlığı, hedef sütunun değiştirildiği sorgularda hedef sütunun duyarlığından büyük değildir.
- PDO_SQLSRV deyimi özniteliklerini
PDO::SQLSRV_ATTR_DIRECT_QUERYveyaPDO::ATTR_EMULATE_PREPARESparametreli sorguda kullanmayın
Şifrelenmiş değerler yerine düz metin geçirme hataları
Şifrelenmiş sütunu hedefleyen herhangi bir değerin sunucuya gönderilmeden önce şifrelenmesi gerekir. Şifrelenmiş bir sütuna düz metin değeri ekleme, değiştirme veya filtreleme girişimi hatayla sonuçlanır. Bu tür hataları önlemek için şunlardan emin olun:
- Always Encrypted etkindir (bağlantı dizesinde anahtar sözcüğünü
ColumnEncryptionolarakEnabledayarlayın). - Şifrelenmiş sütunları hedefleyen verileri göndermek için bind parametresini kullanırsınız. Aşağıdaki örnekte, şifrelenmiş bir sütunda (SSN) sabit/değişmez değere göre yanlış filtreleyen bir sorgu gösterilmektedir:
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
Always Encrypted'ın performans etkisini denetleme
Always Encrypted bir istemci tarafı şifreleme teknolojisi olduğundan, performans ek yükünün çoğu veritabanında değil istemci tarafında gözlemlenir. Şifreleme ve şifre çözme işlemlerinin maliyeti dışında, istemci tarafındaki diğer performans yükü kaynakları şunlardır:
- Sorgu parametrelerinin meta verilerini almak için veritabanına fazladan gidiş dönüşler.
- Bir sütun ana anahtarına erişmek için bir sütun ana anahtar deposuna çağrılar.
Sorgu parametreleri için meta verileri almak için gidiş dönüşler
Always Encrypted bir bağlantı için etkinleştirilirse, ODBC Sürücüsü varsayılan olarak her parametreli sorgu için sys.sp_describe_parameter_encryption çağırarak sorgu deyimini (parametre değerleri olmadan) SQL Server'a geçirir. Bu saklı yordam, herhangi bir parametrenin şifrelenmesi gerekip gerekmediğini öğrenmek için sorgu deyimini analiz eder ve bu durumda sürücünün bunları şifrelemesine izin vermek için her parametre için şifrelemeyle ilgili bilgileri döndürür.
PHP sürücüleri, kullanıcının SQL türünü sağlamadan hazırlanmış bir deyimde parametre bağlamasına olanak sağladığından, Always Encrypted özellikli bir bağlantıda bir parametre bağlarken, PHP Sürücüleri SQL türünü, sütun boyutunu ve ondalık basamakları almak için parametresinde SQLDescribeParam'ı çağırır. Meta veriler daha sonra SQLBindParameter'ı çağırmak için kullanılır. ODBC Sürücüsü çağrıldığında SQLDescribeParam bilgileri zaten istemci tarafında depoladığından bu ek sys.sp_describe_parameter_encryption çağrılar veritabanına fazladan gidiş dönüş gerektirmez.
Önceki davranışlar, şifrelenmiş sütunlara erişen sorguların hangileri olduğunun istemci uygulaması (ve uygulama geliştiricisi) tarafından bilinmesine gerek kalmadan, şifrelenmiş sütunları hedefleyen değerler parametrelerde sürücüye geçirildiği sürece, yüksek düzeyde saydamlık sağlar.
SQL Server'ın ODBC Sürücüsünden farklı olarak, ifade/sorgu düzeyinde Always Encrypted'ın etkinleştirilmesi henüz PHP sürücülerinde desteklenmemektedir.
Sütun şifreleme anahtarı önbelleğe alma
Sütun şifreleme anahtarlarının (CEK) şifresini çözmek için bir sütun anahtar deposuna yapılan çağrı sayısını azaltmak amacıyla, sürücü, düz metin CEK'leri bellekte önbelleğe alır. Veritabanı meta verilerinden şifrelenmiş CEK'yi (ECEK) aldıktan sonra, ODBC sürücüsü önce önbellekteki şifrelenmiş anahtar değerine karşılık gelen düz metin CEK'sini bulmaya çalışır. Sürücü, CMK'yi içeren anahtar depoyu yalnızca önbellekte karşılık gelen düz metin CEK'sini bulamıyorsa çağırır.
Not: SQL Server için ODBC Sürücüsü'nde, önbellekteki girdiler iki saatlik zaman aşımından sonra çıkarılır. Bu davranış, belirli bir ECEK için sürücünün uygulamanın ömrü boyunca veya iki saatte bir (hangisi daha azsa) anahtar deposuna yalnızca bir kez başvurduğunu gösterir.
Sütun Anahtar depolarıyla çalışma
Verilerin şifrelenmesi veya şifresinin çözülmesi için sürücünün hedef sütun için yapılandırılmış bir CEK alması gerekir. CEK'ler, veritabanı meta verilerinde şifrelenmiş biçimde (ECEK) depolanır. Her CEK'in şifrelemek için kullanılan karşılık gelen bir CMK'sı vardır. Veritabanı meta verileri CMK'nin kendisini depolamaz; yalnızca anahtar deposunun adını ve anahtar deposunun CMK'yi bulmak için kullanabileceği bilgileri içerir.
Bir ECEK'nin düz metin değerini almak için, sürücü önce hem CEK hem de ilgili CMK'sı hakkındaki meta verileri alır ve ardından cmk'yi içeren anahtar deposuna başvurmak için bu bilgileri kullanır ve ECEK'nin şifresini çözmesini istemektedir. Sürücü, anahtar deposu sağlayıcısını kullanarak bir anahtar deposuyla iletişim kurar.
SQL Server için PHP için Microsoft Driver 5.3.0 için yalnızca Windows Sertifika Deposu Sağlayıcısı ve Azure Key Vault desteklenir. ODBC Sürücüsü (Özel Anahtar Deposu Sağlayıcısı) tarafından desteklenen diğer Keystore Sağlayıcısı henüz desteklenmiyor.
Windows Sertifika Deposu sağlayıcısını kullanma
Windows üzerinde SQL Server için ODBC Sürücüsü, Windows Sertifika Deposu için adlı MSSQL_CERTIFICATE_STOREyerleşik bir sütun ana anahtar deposu sağlayıcısı içerir. (Bu sağlayıcı macOS veya Linux'ta kullanılamaz.) Bu sağlayıcıyla, CMK istemci makinesinde yerel olarak depolanır ve sürücüyle birlikte kullanmak için uygulama tarafından başka bir yapılandırma gerekmez. Ancak, uygulamanın depodaki sertifikaya ve özel anahtarına erişimi olmalıdır. Daha fazla bilgi için bkz. Sütun Ana Anahtarları Oluşturma ve Depolama (Always Encrypted).
Azure Key Vault'u kullanma
Azure Key Vault, Azure kullanarak şifreleme anahtarlarını, parolaları ve diğer gizli dizileri depolamak için bir yol sunar ve Always Encrypted anahtarlarını depolamak için kullanılabilir. SQL Server için ODBC Sürücüsü (sürüm 17 ve üzeri), Azure Key Vault için yerleşik bir ana anahtar deposu sağlayıcısı içerir. Aşağıdaki bağlantı seçenekleri Azure Key Vault yapılandırmasını işler: KeyStoreAuthentication, KeyStorePrincipalIdve KeyStoreSecret.
-
KeyStoreAuthenticationiki olası dize değerinden birini alabilir:KeyVaultPasswordveKeyVaultClientSecret. Bu değerler, diğer iki anahtar sözcükle ne tür kimlik doğrulama kimlik bilgilerinin kullanılacağını denetler. -
KeyStorePrincipalIdAzure Key Vault'a erişmek isteyen hesabın tanımlayıcısını temsil eden bir dize alır.- Eğer
KeyStoreAuthentication,KeyVaultPasswordolarak ayarlanırsa,KeyStorePrincipalIdbir Microsoft Entra kullanıcısının adı olmalıdır. - Eğer
KeyStoreAuthenticationKeyVaultClientSecretolarak ayarlanırsa,KeyStorePrincipalIdbir uygulama istemci kimliği olmalıdır.
- Eğer
-
KeyStoreSecretkimlik bilgisi gizli ögesini temsil eden bir dize alır.- olarak ayarlandıysa
KeyStoreAuthenticationKeyVaultPasswordKeyStoreSecret, kullanıcının parolası olmalıdır. - "
KeyStoreAuthenticationKeyVaultClientSecretolarak ayarlanırsa,KeyStoreSecretuygulama istemci kimliğiyle ilişkili uygulama gizli anahtarı olmalıdır."
- olarak ayarlandıysa
Azure Key Vault'u kullanmak için üç seçeneğin de bağlantı dizesinde mevcut olması gerekir.
ColumnEncryption, Enabled olarak ayarlanmalıdır. olarak ayarlandıysa ColumnEncryption ancak Azure Key Vault seçenekleri mevcutsaDisabled, betik hatasız devam eder ancak şifreleme gerçekleştirilmeyecektir.
Aşağıdaki örneklerde Azure Key Vault kullanarak SQL Server'a nasıl bağlandığınız gösterilmektedir.
SQLSRV:
Microsoft Entra hesabı kullanma:
$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultPassword", "KeyStorePrincipalId"=>$MSEntraUsername, "KeyStoreSecret"=>$MSEntraPassword);
$conn = sqlsrv_connect($server, $connectionInfo);
Azure uygulama istemci kimliği ve gizli anahtarı kullanma:
$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 hesabı kullanma:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultPassword; KeyStorePrincipalId = $AADUsername; KeyStoreSecret = $AADPassword;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Azure uygulama istemci kimliği ve gizli anahtarı kullanma:
$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultClientSecret; KeyStorePrincipalId = $applicationClientID; KeyStoreSecret = $applicationClientSecret;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);
Always Encrypted kullanırken PHP sürücülerinin sınırlamaları
SQLSRV ve PDO_SQLSRV:
- Linux/macOS, Windows Sertifika Deposu Sağlayıcısını desteklemiyor
- Parametre şifrelemesini mecbur kılma
- Always Encrypted'i deyim düzeyinde etkinleştirme
- Linux ve macOS üzerinde Always Encrypted özelliğini ve UTF8 olmayan yerel ayarları kullanırken (örneğin, "en_US. ISO-8859-1"), şifrelenmiş char(n) sütununa null veri veya boş dize eklemek, sisteminize Kod Sayfası 1252 yüklenmediği sürece çalışmayabilir
Yalnızca SQLSRV:
- SQL türünü belirtmeden bağlama parametresi için kullanma
sqlsrv_query - SQL deyimlerinden oluşan bir toplulukta parametreleri bağlamak için
sqlsrv_preparekullanma
Yalnızca PDO_SQLSRV:
-
PDO::SQLSRV_ATTR_DIRECT_QUERYparametreli sorguda belirtilen deyim özniteliği -
PDO::ATTR_EMULATE_PREPAREparametreli sorguda belirtilen deyim özniteliği - SQL ifadelerinin toplu işlemlerinde parametreleri bağlama
PHP sürücüleri, SQL Server ve veritabanı için ODBC Sürücüsü tarafından uygulanan sınırlamaları da devralır. Bkz. Always Encrypted kullanırken ODBC sürücüsünün sınırlamaları ve Always Encrypted sınırlamaları.
Ayrıca bakınız
PHP SQL Sürücüsü için Programlama Kılavuzu
SQLSRV Sürücü API'si Başvurusu
PDO_SQLSRV Sürücü API'si Başvurusu