Aracılığıyla paylaş


SQL Server için PHP Sürücüleri ile Always Encrypted Kullanma

PHP sürücüsünü indirme

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_prepare ve sqlsrv_execute kullanması gerekir.
      • SQL türünü açıkça ayarlayın.
    • 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.
  • 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_prepare ve sqlsrv_execute kullanmalı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.
    • PDO_SQLSRV Sürücüsü:
      • Deyim özniteliği PDO::SQLSRV_ATTR_DIRECT_QUERY parametreli sorguda desteklenmez.
      • Deyim özniteliği PDO::ATTR_EMULATE_PREPARES parametreli sorguda desteklenmez.

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_prepare SQL türüyle sqlsrv_execute birlikte 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_query kullanarak 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.
    • decimal ve numeric SQL 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, datetimeoffset veya time SQL 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_QUERY veya PDO::ATTR_EMULATE_PREPARES parametreli 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ü ColumnEncryption olarak Enabledayarlayı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.

  • KeyStoreAuthentication iki olası dize değerinden birini alabilir: KeyVaultPassword ve KeyVaultClientSecret. Bu değerler, diğer iki anahtar sözcükle ne tür kimlik doğrulama kimlik bilgilerinin kullanılacağını denetler.
  • KeyStorePrincipalId Azure Key Vault'a erişmek isteyen hesabın tanımlayıcısını temsil eden bir dize alır.
    • Eğer KeyStoreAuthentication, KeyVaultPassword olarak ayarlanırsa, KeyStorePrincipalId bir Microsoft Entra kullanıcısının adı olmalıdır.
    • Eğer KeyStoreAuthenticationKeyVaultClientSecret olarak ayarlanırsa, KeyStorePrincipalId bir uygulama istemci kimliği olmalıdır.
  • KeyStoreSecret kimlik bilgisi gizli ögesini temsil eden bir dize alır.
    • olarak ayarlandıysa KeyStoreAuthenticationKeyVaultPasswordKeyStoreSecret, kullanıcının parolası olmalıdır.
    • "KeyStoreAuthenticationKeyVaultClientSecret olarak ayarlanırsa, KeyStoreSecret uygulama istemci kimliğiyle ilişkili uygulama gizli anahtarı olmalıdır."

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_prepare kullanma

Yalnızca PDO_SQLSRV:

  • PDO::SQLSRV_ATTR_DIRECT_QUERY parametreli sorguda belirtilen deyim özniteliği
  • PDO::ATTR_EMULATE_PREPARE parametreli 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