Fitur basis data selalu rahasia dapat digunakan untuk integrasi dan komputasi data multipihak. Fitur ini memungkinkan pemilik data memberikan otorisasi kepada pihak ketiga untuk menggunakan data dalam komputasi, membantu memenuhi kebutuhan berbagai skenario seperti pemasaran bersama.
Skema
Sebagai contoh, perusahaan platform data mendapatkan izin yang diperlukan untuk menggunakan data pengguna yang dikumpulkan melalui platformnya. Setelah data pengguna terkumpul, platform data tersebut menghasilkan tabel potret pengguna berdasarkan data yang telah dikumpulkan. Kemudian, perusahaan platform data memberikan otorisasi kepada pihak ketiga, seperti perusahaan asuransi, untuk menggunakan data tersebut dalam integrasi dan komputasi data multipihak serta melaksanakan pemasaran bersama.
telepon | usia | memiliki_mobil | konsumsi_tahunan |
13900001111 | 29 | N | 20000 |
13900002222 | 34 | Y | 10000 |
Data pada tabel di atas hanya untuk referensi.
Perusahaan asuransi ingin menggunakan data yang dikumpulkan oleh perusahaan platform data untuk mengembangkan pengguna potensial. Sebagai contoh, perusahaan asuransi ingin menawarkan asuransi kendaraan kepada pemilik mobil.
Saat melakukan kueri gabungan, perhatikan hal-hal berikut:
Izin yang diperlukan belum diperoleh. Dalam kasus ini, pernyataan SQL untuk kueri gabungan gagal, dan pesan yang menunjukkan tidak ada izin yang diperlukan akan ditampilkan.
Otorisasi kueri daftar kontrol perilaku (BCL) dikeluarkan. Dalam kasus ini, pernyataan SQL untuk kueri gabungan berhasil, dan hasil kueri dikembalikan dalam bentuk teks terenkripsi.
Otorisasi dekripsi BCL dikeluarkan. Dalam kasus ini, pihak yang berwenang dapat mendekripsi hasil yang dikembalikan untuk mendapatkan hasil dalam teks biasa.
Prasyarat
Dalam topik ini, perusahaan asuransi yang dijelaskan dalam topik "Perlindungan privasi" digunakan untuk mengilustrasikan integrasi dan komputasi data multipihak. Anda harus menyelesaikan konfigurasi berdasarkan instruksi yang disediakan di Perlindungan Privasi.
Contoh
Perusahaan platform data
Buat pengguna dan tabel untuk basis data sebagai administrator basis data (DBA).
-------- Buat pengguna. -------- -- Perusahaan platform data CREATE USER ly; -- Buat tabel potret pengguna untuk perusahaan platform data. CREATE TABLE portrait ( phone enc_text, age enc_int4, have_car enc_text, annual_consume enc_int8 ); -- Berikan otorisasi kepada perusahaan platform data untuk mengakses tabel data. GRANT ALL ON portrait TO ly;Daftarkan akun dengan perusahaan platform data.
CatatanAlat EncDB secara otomatis menghasilkan pernyataan SQL berdasarkan parameter input. Anda harus menjalankan pernyataan SQL yang dihasilkan di basis data.
./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_ly.bin -e default_enclave_public_key.pem -c ${cipher_suite} # Dapatkan ID dari kunci enkripsi utama (MEK) perusahaan platform data. Anda dapat menjalankan pernyataan SELECT encdb_get_current_mek_id(); untuk mendapatkan ID. # Dalam contoh ini, 6953973016013340672 digunakan. mekid_ly = 6953973016013340672 ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_ly} --mek sample/default_mek_ly.bin --puk sample/usr_puk_ly.pem --pri sample/usr_pri_ly.pem -c ${cipher_suite}Perusahaan platform data membuat kunci enkripsi untuk tabel potret pengguna.
CatatanAnda harus menjalankan pernyataan berikut sebagai pengguna
ly.Fungsi
encdb.dek_xxx()danencdb.keyname_xxx()dalam pernyataan berikut digunakan untuk mengonversi tipe data. Untuk informasi lebih lanjut, lihat Melakukan Konversi antara Teks Biasa dan Teks Terenkripsi.
-- Buat kunci enkripsi data (DEK) dan catat ID grup, seperti fd89d386-ee00-4e0e-9e5f-66efb4c124aa. SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone')); -- Ini hanya contoh. Semua kolom berbagi DEK yang sama. SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','age'),encdb.keyname_generate('ly','demo','public','portrait','phone')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','have_car'),encdb.keyname_generate('ly','demo','public','portrait','phone')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ly','demo','public','portrait','annual_consume'),encdb.keyname_generate('ly','demo','public','portrait','phone'));Dalam kebanyakan kasus, Anda tidak dapat menjalankan pernyataan SQL untuk mengenkripsi data. Hal ini membantu memastikan keamanan. Anda harus diberi otorisasi untuk mengenkripsi data.
Edit BCL untuk memperbarui ruang lingkup otorisasi (termasuk ID grup) dari DEK ke BCL.
./setGroupIdBCL.sh -l fd89d386-ee00-4e0e-9e5f-66efb4c124aaCatatanfd89d386-ee00-4e0e-9e5f-66efb4c124aahanya untuk referensi. Untuk mendapatkan nilai sebenarnya, Anda dapat menjalankan pernyataan berikut:SELECT encdb.dek_generate(encdb.keyname_generate('ly','demo','public','portrait','phone'));Keluarkan BCL.
./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_ly.pem --spuk sample/usr_puk_ly.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_for_ly_insert.txt -c ${cipher_suite} ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_ly.pem --spuk sample/usr_puk_ly.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_for_ly_insert.txt -c ${cipher_suite}
Perusahaan platform data menulis data.
CatatanAnda harus menjalankan pernyataan berikut sebagai pengguna
ly.INSERT INTO portrait VALUES(encdb.enc_text_encrypt('13900001111',encdb.keyname_generate('ly','demo','public','portrait','phone')), encdb.enc_int4_encrypt('29',encdb.keyname_generate('ly','demo','public','portrait','age')), encdb.enc_text_encrypt('N',encdb.keyname_generate('ly','demo','public','portrait','have_car')), encdb.enc_int8_encrypt('2',encdb.keyname_generate('ly','demo','public','portrait','annual_consume'))); INSERT INTO portrait VALUES(encdb.enc_text_encrypt('13900002222',encdb.keyname_generate('ly','demo','public','portrait','phone')), encdb.enc_int4_encrypt('34',encdb.keyname_generate('ly','demo','public','portrait','age')), encdb.enc_text_encrypt('Y',encdb.keyname_generate('ly','demo','public','portrait','have_car')), encdb.enc_int8_encrypt('1',encdb.keyname_generate('ly','demo','public','portrait','annual_consume')));
Perusahaan asuransi
Untuk menawarkan asuransi kendaraan kepada pemilik mobil, departemen penjualan perusahaan asuransi memulai kueri gabungan:
SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE hava_car = 'Y';Berikan izin enkripsi kepada departemen penjualan perusahaan asuransi.
Edit BCL untuk memperbarui ruang lingkup otorisasi (termasuk ID grup) dari DEK ke BCL.
./setGroupIdBCL.sh -s 7903d109-f3e0-4f3e-b815-3682cb8bd6dbCatatan7903d109-f3e0-4f3e-b815-3682cb8bd6dbhanya untuk referensi. Departemen penjualan menggunakan kunci default untuk mengenkripsi data. Untuk mendapatkan ID grup, Anda dapat menjalankan pernyataan berikut:Dapatkan ID MEK akun departemen penjualan, seperti 2715553450389700608. SELECT encdb_get_current_mek_id(); # Dapatkan ID grup. SELECT groupid FROM encdb.encdb_internal_dek_table WHERE mekid = 2715553450389700608;Keluarkan BCL.
./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_sale.pem --bcl sample/bcl_for_sale_insert.txt -c ${cipher_suite} ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_sale.pem --bcl sample/bcl_for_sale_insert.txt -c ${cipher_suite}Departemen penjualan perusahaan asuransi menanyakan data.
Departemen penjualan tidak diberi otorisasi oleh perusahaan platform data untuk menggunakan data perusahaan platform data.
CatatanAnda harus menjalankan pernyataan berikut sebagai pengguna
ins_sale.SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE pt.have_car = encdb.enc_text_encrypt('Y',encdb.keyname_generate('ins_sale','demo', Null, Null, Null)); WARNING: -- encdb -- -- Log tidak terpercaya -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 6953973016013340672) dari tabel gagal - dikembalikan 0xfa030000 ERROR: pg_enc_cmp_eq: jenis terenkripsi sama errno: fa030000CatatanJika pesan kesalahan
ERROR: permission denied for table portraitditampilkan, Anda dapat menjalankan pernyataanGRANT SELECT ON portrait TO ins_sale;untuk memberikan izin akses pada tabel.Departemen penjualan perusahaan asuransi mendapatkan izin yang diperlukan dari perusahaan platform data dan departemen data perusahaan platform data. Kemudian, departemen penjualan perusahaan asuransi menggunakan data perusahaan platform data.
Departemen penjualan mengajukan permohonan otorisasi dari perusahaan platform data. Perusahaan platform data meninjau dan menyetujui aplikasi tersebut lalu mengeluarkan otorisasi.
# Departemen penjualan mengajukan permohonan otorisasi: Tanda tangan subjek. ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_ly_for_sale_select.txt -c ${cipher_suite} # Perusahaan platform data meninjau dan menyetujui aplikasi lalu mengeluarkan otorisasi BCL: Tanda tangan penerbit. ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_ly.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_ly.pem --bcl sample/bcl_ly_for_sale_select.txt -c ${cipher_suite}Departemen penjualan mengajukan permohonan otorisasi dari departemen data perusahaan platform data. Departemen data meninjau dan menyetujui aplikasi tersebut lalu mengeluarkan otorisasi.
# Departemen penjualan mengajukan permohonan otorisasi: Tanda tangan subjek. ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_sale.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_data_for_sale_select.txt -c ${cipher_suite} # Departemen data meninjau dan menyetujui aplikasi lalu mengeluarkan otorisasi BCL: Tanda tangan penerbit. ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_sale.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_data_for_sale_select.txt -c ${cipher_suite}Departemen penjualan dapat menjalankan kueri gabungan dengan benar dan mendapatkan hasil kueri dalam bentuk teks terenkripsi.
CatatanAnda harus menjalankan pernyataan berikut sebagai pengguna
ins_sale.SELECT * FROM person ps JOIN portrait pt ON ps.phone = pt.phone WHERE pt.have_car = encdb.enc_text_encrypt('Y',encdb.keyname_generate('ins_sale','demo', Null, Null, Null)); -- Jalankan kueri gabungan dan dapatkan hasil kueri dalam bentuk teks terenkripsi.