Menggunakan Always Encrypted dengan Driver PHP untuk SQL Server
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
dansqlsrv_execute
untuk menjalankan kueri berparameter. - Atur jenis SQL secara eksplisit.
- Andalkan driver PHP untuk menentukan dan mengatur jenis SQL yang tepat. Dalam hal ini, pengguna harus menggunakan
- 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.
- Untuk driver SQLSRV, pengguna memiliki dua opsi:
- 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
dansqlsrv_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.
- Jika pengguna ingin driver menentukan jenis SQL untuk kolom terenkripsi, pengguna harus menggunakan
- 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.
- Atribut
- Driver SQLSRV:
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
dansqlsrv_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 dannumeric
sama dengan konfigurasi presisi dan skala untuk kolom target. - Presisi parameter yang menargetkan kolom jenis
datetime2
data , ,datetimeoffset
atautime
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 atauPDO::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 keEnabled
). - 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
, , KeyStorePrincipalId
dan KeyStoreSecret
.
KeyStoreAuthentication
dapat mengambil salah satu dari dua nilai string yang mungkin:KeyVaultPassword
danKeyVaultClientSecret
. 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 keKeyVaultPassword
, makaKeyStorePrincipalId
harus menjadi nama pengguna Microsoft Entra. - Jika
KeyStoreAuthentication
diatur keKeyVaultClientSecret
, makaKeyStorePrincipalId
harus berupa ID klien aplikasi.
- Jika
KeyStoreSecret
mengambil string yang mewakili rahasia kredensial.- Jika
KeyStoreAuthentication
diatur keKeyVaultPassword
, makaKeyStoreSecret
harus berupa kata sandi pengguna. - Jika
KeyStoreAuthentication
diatur keKeyVaultClientSecret
, makaKeyStoreSecret
harus menjadi rahasia aplikasi yang terkait dengan ID klien aplikasi.
- Jika
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 berparameterPDO::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.
Lihat juga
Panduan Pemrograman untuk Driver PHP SQL
Referensi API Driver SQLSRV
Referensi API Driver PDO_SQLSRV