Bagikan melalui


Menggunakan Always Encrypted dengan Driver PHP untuk SQL Server

Unduh driver PHP

Berlaku untuk

  • Microsoft Drivers 5.2 untuk PHP untuk SQL Server

Pendahuluan

Artikel ini menyediakan informasi tentang cara mengembangkan aplikasi PHP menggunakan Always Encrypted (Mesin Database) dan Driver PHP untuk SQL Server.

Always Encrypted memungkinkan aplikasi klien mengenkripsi data sensitif dan tidak pernah mengungkapkan data atau kunci enkripsi ke SQL Server atau Azure SQL Database. Driver yang diaktifkan Always Encrypted, seperti Driver ODBC untuk SQL Server, secara transparan mengenkripsi dan mendekripsi data sensitif dalam aplikasi klien. Driver secara otomatis menentukan parameter kueri mana yang sesuai dengan kolom database sensitif (dilindungi menggunakan Always Encrypted), dan mengenkripsi nilai parameter tersebut sebelum meneruskan data ke SQL Server atau Azure SQL Database. Demikian pula, driver secara transparan mendekripsi data yang diambil dari kolom database terenkripsi dalam hasil kueri. Untuk informasi selengkapnya, lihat Always Encrypted (Mesin Database). Driver PHP untuk SQL Server menggunakan Driver ODBC untuk SQL Server untuk mengenkripsi data sensitif.

Prasyarat

  • Konfigurasikan Always Encrypted di database Anda. Konfigurasi ini melibatkan penyediaan kunci Always Encrypted dan menyiapkan enkripsi untuk kolom database yang dipilih. Jika Anda belum memiliki database dengan Always Encrypted yang dikonfigurasi, ikuti petunjuk dalam Tutorial: Memulai Always Encrypted. Secara khusus, database Anda harus berisi definisi metadata untuk Kunci Master Kolom (CMK), Kunci Enkripsi Kolom (CEK), dan tabel yang berisi satu atau beberapa kolom yang dienkripsi menggunakan CEK tersebut.
  • Pastikan Driver ODBC untuk SQL Server versi 17 atau yang lebih tinggi diinstal pada komputer pengembangan Anda. Untuk detailnya, lihat Driver ODBC untuk SQL Server.

Mengaktifkan Always Encrypted dalam aplikasi PHP

Cara term mudah untuk mengaktifkan enkripsi parameter yang menargetkan kolom terenkripsi dan dekripsi hasil kueri adalah dengan mengatur nilai ColumnEncryption kata kunci string koneksi ke Enabled. Berikut ini adalah contoh mengaktifkan Always Encrypted di driver SQLSRV dan PDO_SQLSRV:

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

Mengaktifkan Always Encrypted tidak cukup untuk enkripsi atau dekripsi agar berhasil; Anda juga perlu memastikan bahwa:

  • Aplikasi ini memiliki izin database VIEW ANY COLUMN MASTER KEY DEFINITION dan VIEW ANY COLUMN ENCRYPTION KEY DEFINITION, yang diperlukan untuk mengakses metadata tentang kunci Always Encrypted dalam database. Untuk detailnya, lihat Izin Database.
  • Aplikasi dapat mengakses CMK yang melindungi CEK untuk kolom terenkripsi yang dikueri. Persyaratan ini tergantung pada penyedia penyimpanan kunci yang menyimpan CMK. Untuk informasi selengkapnya, lihat Bekerja dengan Penyimpanan Kunci Master Kolom.

Mengambil dan memodifikasi data dalam kolom terenkripsi

Setelah mengaktifkan Always Encrypted pada koneksi, Anda dapat menggunakan API SQLSRV standar (lihat Referensi API Driver SQLSRV) atau API PDO_SQLSRV (lihat Referensi API Driver PDO_SQLSRV) untuk mengambil atau memodifikasi data dalam kolom database terenkripsi. Dengan asumsi aplikasi Anda memiliki izin database yang diperlukan dan dapat mengakses kunci master kolom, driver mengenkripsi parameter kueri apa pun yang menargetkan kolom terenkripsi dan mendekripsi data yang diambil dari kolom terenkripsi, berperilaku transparan ke aplikasi seolah-olah kolom tidak dienkripsi.

Jika Always Encrypted tidak diaktifkan, kueri dengan parameter yang menargetkan kolom terenkripsi gagal. Data masih dapat diambil dari kolom terenkripsi, selama kueri tidak memiliki parameter yang menargetkan kolom terenkripsi. Namun, driver tidak mencoba dekripsi apa pun dan aplikasi menerima data terenkripsi biner (sebagai array byte).

Tabel berikut ini meringkas perilaku kueri, bergantung pada apakah Always Encrypted diaktifkan atau tidak:

Karakteristik kueri Always Encrypted diaktifkan dan aplikasi dapat mengakses kunci dan metadata kunci Always Encrypted diaktifkan dan aplikasi tidak dapat mengakses kunci atau metadata kunci Always Encrypted dinonaktifkan
Parameter yang menargetkan kolom terenkripsi. Nilai parameter dienkripsi secara transparan. Kesalahan Kesalahan
Mengambil data dari kolom terenkripsi, tanpa parameter yang menargetkan kolom terenkripsi. Hasil dari kolom terenkripsi didekripsi secara transparan. Aplikasi menerima nilai kolom teks biasa. Kesalahan Hasil dari kolom terenkripsi tidak didekripsi. Aplikasi menerima nilai terenkripsi sebagai array byte.

Contoh berikut mengilustrasikan pengambilan dan modifikasi data dalam kolom terenkripsi. Contoh mengasumsikan tabel dengan skema berikut. Kolom SSN dan BirthDate dienkripsi.

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

Contoh penyisipan data

Contoh berikut menunjukkan cara menggunakan driver SQLSRV dan PDO_SQLSRV untuk menyisipkan baris ke dalam tabel Pasien. Perhatikan poin berikut:

  • Tidak ada yang khusus untuk enkripsi dalam kode sampel. Driver secara otomatis mendeteksi dan mengenkripsi nilai parameter SSN dan BirthDate, yang menargetkan kolom terenkripsi. Mekanisme ini membuat enkripsi transparan ke aplikasi.
  • Nilai yang disisipkan ke dalam kolom database, termasuk kolom terenkripsi, diteruskan sebagai parameter terikat. Saat menggunakan parameter bersifat opsional saat mengirim nilai ke kolom yang tidak dienkripsi (meskipun sangat disarankan karena membantu mencegah injeksi SQL), nilai diperlukan untuk nilai yang menargetkan kolom terenkripsi. Jika nilai yang disisipkan dalam kolom SSN atau BirthDate diteruskan sebagai harfiah yang disematkan dalam pernyataan kueri, kueri akan gagal karena driver tidak mencoba mengenkripsi atau memproses literal dalam kueri. Akibatnya, server akan menolaknya sebagai tidak kompatibel dengan kolom terenkripsi.
  • Saat menyisipkan nilai menggunakan parameter ikatan, jenis SQL yang identik dengan jenis data kolom target atau yang konversinya ke jenis data kolom target didukung harus diteruskan ke database. Persyaratan ini karena Always Encrypted mendukung beberapa konversi jenis (untuk detailnya, lihat Always Encrypted (Mesin Database)). Dua driver PHP, SQLSRV dan PDO_SQLSRV, masing-masing memiliki mekanisme untuk membantu pengguna menentukan jenis nilai SQL. Dengan demikian, pengguna tidak perlu menyediakan jenis SQL secara eksplisit.
    • Untuk driver SQLSRV, pengguna memiliki dua opsi:
      • Andalkan driver PHP untuk menentukan dan mengatur jenis SQL yang tepat. Dalam hal ini, pengguna harus menggunakan sqlsrv_prepare dan sqlsrv_execute untuk menjalankan kueri berparameter.
      • Atur jenis SQL secara eksplisit.
    • Untuk driver PDO_SQLSRV, pengguna tidak dapat secara eksplisit mengatur jenis parameter SQL. Driver PDO_SQLSRV secara otomatis membantu pengguna menentukan jenis SQL saat mengikat parameter.
  • Agar driver menentukan jenis SQL, beberapa batasan berlaku:
    • Driver SQLSRV:
      • Jika pengguna ingin driver menentukan jenis SQL untuk kolom terenkripsi, pengguna harus menggunakan sqlsrv_prepare dan sqlsrv_execute.
      • Jika sqlsrv_query lebih disukai, pengguna bertanggung jawab untuk menentukan jenis SQL untuk semua parameter. Jenis SQL yang ditentukan harus menyertakan panjang string untuk jenis string, dan skala dan presisi untuk jenis desimal.
    • Driver PDO_SQLSRV:
      • Atribut PDO::SQLSRV_ATTR_DIRECT_QUERY pernyataan tidak didukung dalam kueri berparameter.
      • Atribut PDO::ATTR_EMULATE_PREPARES pernyataan tidak didukung dalam kueri berparameter.

Driver dan sqlsrv_prepare SQLSRV:

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

Driver dan sqlsrv_query SQLSRV:

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

driver PDO_SQLSRV dan PDO::p repare:

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

Contoh pengambilan data teks biasa

Contoh berikut menunjukkan pemfilteran data berdasarkan nilai terenkripsi, dan mengambil data teks biasa dari kolom terenkripsi menggunakan driver SQLSRV dan PDO_SQLSRV. Perhatikan poin berikut:

  • Nilai yang digunakan dalam klausul WHERE untuk memfilter pada kolom SSN perlu diteruskan menggunakan parameter ikat, sehingga driver dapat mengenkripsinya secara transparan sebelum mengirimkannya ke server.
  • Saat menjalankan kueri dengan parameter terikat, driver PHP secara otomatis menentukan jenis SQL untuk pengguna kecuali pengguna secara eksplisit menentukan jenis SQL saat menggunakan driver SQLSRV.
  • Semua nilai yang dicetak oleh program berada dalam teks biasa, karena driver secara transparan mendekripsi data yang diambil dari kolom SSN dan BirthDate.

Catatan

Kueri dapat melakukan perbandingan kesetaraan pada kolom terenkripsi hanya jika enkripsi deterministik.

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 = "SELET [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();

Contoh pengambilan data Ciphertext

Jika Always Encrypted tidak diaktifkan, kueri masih dapat mengambil data dari kolom terenkripsi, selama kueri tidak memiliki parameter yang menargetkan kolom terenkripsi.

Contoh berikut menggambarkan pengambilan data terenkripsi biner dari kolom terenkripsi menggunakan driver SQLSRV dan PDO_SQLSRV. Perhatikan poin berikut:

  • Karena Always Encrypted tidak diaktifkan dalam string koneksi, kueri mengembalikan nilai terenkripsi SSN dan BirthDate sebagai array byte (program mengonversi nilai menjadi string).
  • Kueri yang mengambil data dari kolom terenkripsi dengan Always Encrypted dinonaktifkan dapat memiliki parameter, selama tidak ada parameter yang menargetkan kolom terenkripsi. Filter kueri berikut menurut LastName, yang tidak dienkripsi dalam database. Jika kueri difilter menurut SSN atau BirthDate, kueri akan gagal.

SQLSRV:

$query = "SELET [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 = "SELET [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName] = ?";
$lastName = "Abel";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $lastName);
$stmt->execute();
$row = $stmt->fetch();

Menghindari masalah umum saat mengkueri kolom terenkripsi

Bagian ini menjelaskan kategori kesalahan umum saat mengkueri kolom terenkripsi dari aplikasi PHP dan beberapa panduan tentang cara menghindarinya.

Kesalahan konversi jenis data yang tidak didukung

Always Encrypted mendukung beberapa konversi untuk jenis data terenkripsi. Lihat Always Encrypted (Mesin Database) untuk daftar terperinci konversi jenis yang didukung. Lakukan hal berikut untuk menghindari kesalahan konversi jenis data:

  • Saat menggunakan driver SQLSRV dengan sqlsrv_prepare dan sqlsrv_execute jenis SQL, bersama dengan ukuran kolom dan jumlah digit desimal parameter ditentukan secara otomatis.
  • Saat menggunakan driver PDO_SQLSRV untuk menjalankan kueri, jenis SQL dengan ukuran kolom dan jumlah digit desimal parameter juga ditentukan secara otomatis
  • Saat menggunakan driver SQLSRV dengan sqlsrv_query untuk menjalankan kueri:
    • Jenis parameter SQL sama persis dengan jenis kolom yang ditargetkan, atau konversi dari jenis SQL ke jenis kolom didukung.
    • Presisi dan skala parameter yang menargetkan kolom dari decimal jenis data SQL Server dan numeric sama dengan konfigurasi presisi dan skala untuk kolom target.
    • Presisi parameter yang menargetkan kolom jenis datetime2data , , datetimeoffsetatau time SQL Server tidak lebih besar dari presisi untuk kolom target, dalam kueri yang memodifikasi kolom target.
  • Jangan gunakan atribut PDO::SQLSRV_ATTR_DIRECT_QUERY pernyataan PDO_SQLSRV atau PDO::ATTR_EMULATE_PREPARES dalam kueri berparameter

Kesalahan karena meneruskan teks biasa alih-alih nilai terenkripsi

Nilai apa pun yang menargetkan kolom terenkripsi perlu dienkripsi sebelum dikirim ke server. Upaya untuk menyisipkan, memodifikasi, atau memfilter berdasarkan nilai teks biasa pada kolom terenkripsi menghasilkan kesalahan. Untuk mencegah kesalahan tersebut, pastikan bahwa:

  • Always Encrypted diaktifkan (di string koneksi, atur ColumnEncryption kata kunci ke Enabled).
  • Anda menggunakan parameter ikat untuk mengirim data yang menargetkan kolom terenkripsi. Contoh berikut menunjukkan kueri yang salah memfilter menurut literal/konstanta pada kolom terenkripsi (SSN):
$query = "SELET [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";

Mengontrol dampak performa Always Encrypted

Karena Always Encrypted adalah teknologi enkripsi sisi klien, sebagian besar overhead performa diamati di sisi klien, bukan dalam database. Terlepas dari biaya operasi enkripsi dan dekripsi, sumber kinerja overhead lainnya di sisi klien adalah:

  • Pulang pergi ekstra ke database untuk mengambil metadata untuk parameter kueri.
  • Memanggil ke penyimpanan kunci master kolom untuk mengakses kunci master kolom.

Pulang-pergi untuk mengambil metadata untuk parameter kueri

Jika Always Encrypted diaktifkan untuk koneksi, Driver ODBC akan, secara default, memanggil sys.sp_describe_parameter_encryption untuk setiap kueri berparameter, meneruskan pernyataan kueri (tanpa nilai parameter apa pun) ke SQL Server. Prosedur tersimpan ini menganalisis pernyataan kueri untuk mengetahui apakah ada parameter yang perlu dienkripsi, dan jika demikian, mengembalikan informasi terkait enkripsi untuk setiap parameter untuk memungkinkan driver mengenkripsinya.

Karena driver PHP memungkinkan pengguna untuk mengikat parameter dalam pernyataan yang disiapkan tanpa menyediakan jenis SQL, saat mengikat parameter dalam koneksi yang diaktifkan Always Encrypted, Driver PHP memanggil SQLDescribeParam pada parameter untuk mendapatkan jenis SQL, ukuran kolom, dan digit desimal. Metadata kemudian digunakan untuk memanggil SQLBindParameter. Panggilan tambahan SQLDescribeParam ini tidak memerlukan perjalanan pulang pergi tambahan ke database karena Driver ODBC telah menyimpan informasi di sisi klien ketika sys.sp_describe_parameter_encryption dipanggil.

Perilaku sebelumnya memastikan tingkat transparansi yang tinggi terhadap aplikasi klien (dan pengembang aplikasi) tidak perlu mengetahui kueri mana yang mengakses kolom terenkripsi, selama nilai yang menargetkan kolom terenkripsi diteruskan ke driver dalam parameter.

Tidak seperti Driver ODBC untuk SQL Server, mengaktifkan Always Encrypted pada tingkat pernyataan/kueri belum didukung di driver PHP.

Penembolokan kunci enkripsi kolom

Untuk mengurangi jumlah panggilan ke penyimpanan kunci master kolom untuk mendekripsi kunci enkripsi kolom (CEK), driver menyimpan CEK teks biasa dalam memori. Setelah menerima CEK terenkripsi (ECEK) dari metadata database, driver ODBC pertama-tama mencoba menemukan CEK teks biasa yang sesuai dengan nilai kunci terenkripsi dalam cache. Driver memanggil penyimpanan kunci yang berisi CMK hanya jika tidak dapat menemukan CEK teks biasa yang sesuai di cache.

Catatan: Di Driver ODBC untuk SQL Server, entri dalam cache dikeluarkan setelah batas waktu dua jam. Perilaku ini berarti bahwa untuk ECEK tertentu, driver menghubungi penyimpanan kunci hanya sekali selama masa pakai aplikasi atau setiap dua jam, mana yang kurang.

Bekerja dengan penyimpanan Kunci Master Kolom

Untuk mengenkripsi atau mendekripsi data, driver perlu mendapatkan CEK yang dikonfigurasi untuk kolom target. CEK disimpan dalam bentuk terenkripsi (ECEK) dalam metadata database. Setiap CEK memiliki CMK yang sesuai yang digunakan untuk mengenkripsinya. Metadata database tidak menyimpan CMK itu sendiri; metadata hanya berisi nama penyimpanan kunci dan informasi yang dapat digunakan penyimpanan kunci untuk menemukan CMK.

Untuk mendapatkan nilai teks biasa dari ECEK, driver terlebih dahulu mendapatkan metadata tentang CEK dan CMK yang sesuai, lalu menggunakan informasi ini untuk menghubungi penyimpanan kunci yang berisi CMK dan memintanya untuk mendekripsi ECEK. Driver berkomunikasi dengan penyimpanan kunci menggunakan penyedia penyimpanan kunci.

Untuk Microsoft Driver 5.3.0 untuk PHP untuk SQL Server, hanya Penyedia Penyimpanan Sertifikat Windows dan Azure Key Vault yang didukung. Penyedia Keystore lainnya yang didukung oleh Driver ODBC (Penyedia Keystore Kustom) belum didukung.

Menggunakan penyedia Windows Certificate Store

Driver ODBC untuk SQL Server di Windows menyertakan penyedia penyimpanan kunci master kolom bawaan untuk Windows Certificate Store, bernama MSSQL_CERTIFICATE_STORE. (Penyedia ini tidak tersedia di macOS atau Linux.) Dengan penyedia ini, CMK disimpan secara lokal di komputer klien dan tidak ada konfigurasi lain oleh aplikasi yang diperlukan untuk menggunakannya dengan driver. Namun, aplikasi harus memiliki akses ke sertifikat dan kunci privatnya di penyimpanan. Untuk informasi selengkapnya, lihat Membuat dan Menyimpan Kunci Master Kolom (Always Encrypted).

Gunakan Azure Key Vault

Azure Key Vault menawarkan cara untuk menyimpan kunci enkripsi, kata sandi, dan rahasia lainnya menggunakan Azure dan dapat digunakan untuk menyimpan kunci untuk Always Encrypted. Driver ODBC untuk SQL Server (versi 17 dan yang lebih tinggi) mencakup penyedia penyimpanan kunci master bawaan untuk Azure Key Vault. Opsi koneksi berikut menangani konfigurasi Azure Key Vault: KeyStoreAuthentication, , KeyStorePrincipalIddan KeyStoreSecret.

  • KeyStoreAuthentication dapat mengambil salah satu dari dua nilai string yang mungkin: KeyVaultPassword dan KeyVaultClientSecret. Nilai-nilai ini mengontrol jenis kredensial autentikasi yang digunakan dengan dua kata kunci lainnya.
  • KeyStorePrincipalId mengambil string yang mewakili pengidentifikasi untuk akun yang ingin mengakses Azure Key Vault.
    • Jika KeyStoreAuthentication diatur ke KeyVaultPassword, maka KeyStorePrincipalId harus menjadi nama pengguna Microsoft Entra.
    • Jika KeyStoreAuthentication diatur ke KeyVaultClientSecret, maka KeyStorePrincipalId harus berupa ID klien aplikasi.
  • KeyStoreSecret mengambil string yang mewakili rahasia kredensial.
    • Jika KeyStoreAuthentication diatur ke KeyVaultPassword, maka KeyStoreSecret harus berupa kata sandi pengguna.
    • Jika KeyStoreAuthentication diatur ke KeyVaultClientSecret, maka KeyStoreSecret harus menjadi rahasia aplikasi yang terkait dengan ID klien aplikasi.

Ketiga opsi harus ada di string koneksi untuk menggunakan Azure Key Vault. Selain itu, ColumnEncryption harus diatur ke Enabled. Jika ColumnEncryption diatur ke Disabled tetapi opsi Azure Key Vault ada, skrip akan berlanjut tanpa kesalahan tetapi tidak ada enkripsi yang akan dilakukan.

Contoh berikut menunjukkan cara menyambungkan ke SQL Server menggunakan Azure Key Vault.

SQLSRV:

Menggunakan akun Microsoft Entra:

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

Menggunakan ID dan rahasia klien aplikasi Azure:

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

PDO_SQLSRV: Menggunakan akun Microsoft Entra:

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

Menggunakan ID dan rahasia klien aplikasi Azure:

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

Batasan driver PHP saat menggunakan Always Encrypted

SQLSRV dan PDO_SQLSRV:

  • Linux/macOS tidak mendukung Penyedia Penyimpanan Sertifikat Windows
  • Memaksa enkripsi parameter
  • Mengaktifkan Always Encrypted pada tingkat pernyataan
  • Saat menggunakan fitur Always Encrypted dan lokal non-UTF8 di Linux dan macOS (seperti "en_US. ISO-8859-1"), memasukkan data null atau string kosong ke dalam kolom karakter terenkripsi mungkin tidak berfungsi kecuali Halaman Kode 1252 telah diinstal pada sistem Anda

Hanya SQLSRV:

  • Menggunakan sqlsrv_query untuk parameter pengikatan tanpa menentukan jenis SQL
  • Menggunakan sqlsrv_prepare untuk mengikat parameter dalam batch pernyataan SQL

PDO_SQLSRV saja:

  • PDO::SQLSRV_ATTR_DIRECT_QUERY atribut pernyataan yang ditentukan dalam kueri berparameter
  • PDO::ATTR_EMULATE_PREPARE atribut pernyataan yang ditentukan dalam kueri berparameter
  • parameter pengikatan dalam batch pernyataan SQL

Driver PHP juga mewarisi batasan yang diberlakukan oleh Driver ODBC untuk SQL Server dan database. Lihat Batasan driver ODBC saat menggunakan batasan Always Encrypted dan Always Encrypted.

Baca juga

Panduan Pemrograman untuk Driver PHP SQL
Referensi API Driver SQLSRV
Referensi API Driver PDO_SQLSRV