Security & Privacy
Membangun Aplikasi Obrolan Terenkripsi yang Mematuhi GDPR
52 mnt
cara membuat aplikasi obrolan yang mematuhi gdpr pendahuluan halo komunitas back4app! ini adalah tutorial tamu dari tim di virgil security, inc https //virgilsecurity com/?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat kami adalah teknologi kripto di balik pesan terenkripsi end to end twilio https //www twilio com/blog/2016/05/introducing end to end encryption for twilio ip messaging with virgil security html teman teman kami di back4app meminta kami untuk menunjukkan kepada anda cara membangun aplikasi obrolan terenkripsi end to end di atas back4app dalam pos ini, kami akan memandu anda melalui langkah langkah untuk membuat aplikasi messenger android back4app yang terenkripsi end to end! apakah anda siap? ps jika anda tidak peduli dengan detailnya, cukup lewati ke akhir pos dan unduh produk akhir apa itu enkripsi end to end? pertama, mari kita mulai dengan penyegaran cepat tentang apa itu e2ee (enkripsi end to end) dan bagaimana cara kerjanya e2ee itu sederhana ketika anda mengetik pesan obrolan, pesan tersebut dienkripsi di perangkat seluler anda (atau di browser anda) dan hanya didekripsi ketika pasangan obrolan anda menerimanya dan ingin menampilkannya di jendela obrolan pesan tetap terenkripsi saat bepergian melalui wi fi dan internet, melalui cloud / server web, ke dalam database, dan dalam perjalanan kembali ke pasangan obrolan anda dengan kata lain, tidak ada jaringan atau server yang tahu apa yang anda俩 obrolkan apa yang sulit dalam enkripsi end to end adalah tugas mengelola kunci enkripsi dengan cara yang hanya dapat diakses oleh pengguna yang terlibat dalam obrolan dan tidak ada orang lain dan ketika saya menulis “tidak ada orang lain”, saya benar benar maksudkan bahkan orang dalam penyedia cloud anda atau bahkan anda, pengembang, tidak diperbolehkan; tidak ada kesalahan yang tidak disengaja https //techcrunch com/2017/11/29/meet the man who deactivated trumps twitter account/ atau pengintaian yang dipaksakan secara hukum dimungkinkan menulis kripto, terutama untuk beberapa platform itu sulit menghasilkan angka acak yang benar, memilih algoritma yang tepat, dan memilih mode enkripsi yang tepat hanyalah beberapa contoh yang membuat sebagian besar pengembang mengangkat tangan mereka di udara dan akhirnya tidak melakukannya postingan blog ini akan menunjukkan kepada anda bagaimana mengabaikan semua detail yang mengganggu ini dan dengan cepat serta sederhana melakukan enkripsi end to end menggunakan sdk virgil sebagai pengantar, inilah cara kami akan meningkatkan aplikasi messenger back4app agar menjadi enkripsi end to end selama pendaftaran kami akan menghasilkan kunci pribadi & publik individu untuk pengguna baru (ingat kunci publik penerima mengenkripsi pesan dan kunci pribadi penerima yang cocok mendekripsinya) sebelum mengirim pesan, anda akan mengenkripsi pesan obrolan dengan kunci publik penerima setelah menerima pesan, anda akan mendekripsi pesan obrolan dengan kunci pribadi penerima kami akan menerbitkan kunci publik pengguna ke layanan kartu virgil sehingga pengguna obrolan dapat saling mencari dan dapat mengenkripsi pesan untuk satu sama lain kunci pribadi akan tetap di perangkat pengguna jaga tetap sederhana ini adalah implementasi e2ee chat yang paling sederhana dan berfungsi dengan baik untuk aplikasi chat sederhana antara 2 pengguna di mana percakapan bersifat sementara dan tidak masalah jika kehilangan riwayat pesan jika perangkat hilang bersama kunci privat di dalamnya oke, cukup berbicara! mari kita mulai coding kita akan mulai dengan memandu anda melalui pengaturan aplikasi android, kemudian, kita akan menambahkan beberapa kode untuk membuat aplikasi terenkripsi end to end prasyarat untuk menyelesaikan tutorial ini, anda perlu android studio sebuah aplikasi yang dibuat di back4app ikuti tutorial buat aplikasi baru untuk belajar bagaimana cara membuat aplikasi di back4app daftar untuk sebuah akun virgil security (kita akan membuat aplikasi nanti) mari kita siapkan aplikasi messenger back4app yang “bersih” 1 siapkan server aplikasi anda mari kita mulai dengan menerapkan fungsi cloud untuk ini, anda perlu temukan main js main js dan package json package json di scripts scripts direktori; buka main js main js dengan editor favorit anda 1 1) dapatkan kredensial back4app buka dashboard dashboard aplikasi anda > pengaturan aplikasi pengaturan aplikasi > keamanan & kunci keamanan & kunci di main js main js , ganti parse app id parse app id dengan id aplikasi id aplikasi anda dan parse rest api key parse rest api key dengan kunci rest api kunci rest api 1 2) dapatkan kredensial virgil buat aplikasi di dasbor virgil https //dashboard virgilsecurity com/ buka aplikasi virgil baru anda, navigasikan ke bagian e3kit dan buat sebuah env env file di bawah bagian e3kit di bilah sisi kiri salin nilai dari app id app id , app key app key , dan app key id app key id dari env env file ganti nilai yang disalin di main js main js file di bidang yang sesuai ( main js main js dari scripts scripts direktori) 1 3) terapkan fungsi kode cloud buka “dashboard” back4app aplikasi anda > “core” > fungsi kode cloud; klik +tambah dan pilih main js dan package json (dari direktori skrip), setelah itu pindahkan keduanya ke folder cloud; klik deploy 2 mulai aplikasi demo kotlin back4app yang bersih jangan lupa untuk mengatur fungsi kode cloud back4app terlebih dahulu ini adalah bagian yang wajib dari demo ini setelah ini, ikuti langkah langkah berikut 2 1) impor proyek di android studio buka android studio > file file > baru baru > proyek dari kontrol versi proyek dari kontrol versi > git git url repositori git https //github com/virgilsecurity/chat back4app android periksa cabang clean chat kt clean chat kt penting! pilih jenis file tree “proyek” ini akan digunakan sepanjang tutorial 2 2) atur kredensial back4app di proyek buka “dasbor” back4app aplikasi anda > “pengaturan aplikasi” > “keamanan & kunci”; pergi ke /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml file di proyek android anda dan ganti your back4app app id your back4app app id dengan application id application id anda dan your back4app client key your back4app client key dengan client key client key 2 3) siapkan db buka back4app “dashboard” > “core” > “database browser” > “buat kelas” dan buat kelas dari custom custom tipe bernama message message dan chatthread chatthread ; 2 4) siapkan kueri langsung kembali ke akun back4app https //dashboard back4app com/apps/#!/admin tekan tombol pengaturan server pengaturan server pada aplikasi anda temukan blok “web hosting dan kueri langsung” buka pengaturan kueri langsung dan periksa opsi aktifkan hosting aktifkan hosting pilih nama untuk subdomain anda untuk mengaktifkan kueri langsung untuk 2 kelas yang anda buat pesan pesan dan chatthread chatthread salin nama subdomain baru anda dan klik tombol simpan kembali ke /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml dan tempel “nama subdomain” yang telah anda masukkan di atas ke dalam back4app live query url back4app live query url alih alih “yoursubdomainname” setelah langkah langkah ini, anda akan dapat menekan tombol jalankan di android studio dan membuat contoh ini berfungsi gunakan emulator atau perangkat nyata untuk mengujinya 3 jalankan demo bersih untuk melihat hasil dari menjalankan versi bersih dari demo, anda perlu daftar 2 pengguna; mulai percakapan di antara mereka dan kirim beberapa pesan; 3\ buka back4app “dashboard” > “core” > “database browser” > “message” jika semuanya berhasil, anda harus melihat aplikasi messenger chat muncul daftarkan dua pengguna dan kirim beberapa pesan satu sama lain anda harus melihat data baru muncul di pesan pesan kelas perhatikan bahwa anda dapat melihat di server tentang apa yang sedang dibicarakan pengguna anda selanjutnya tutup antarmuka obrolan anda dan lanjutkan ke langkah berikutnya – menambahkan enkripsi e2ee sekarang, mari kita enkripsi end to end pesan pesan itu! pada akhir bagian ini, inilah bagaimana pesan obrolan anda akan terlihat di server dapatkah anda melihat perbedaannya? bagaimana kita bisa sampai ke sana? jelas, kita perlu menerapkan enkripsi end to end, yang berarti aplikasi kita perlu menghasilkan pasangan kunci privat & publik sebagai bagian dari pendaftaran menyimpan kunci privat di penyimpanan kunci di perangkat pengguna menerbitkan kunci publik di layanan kartu virgil sebagai “kartu virgil” untuk diunduh pengguna lain & mengenkripsi pesan dengan itu mengenkripsi pesan dengan kunci publik dan menandatangani dengan kunci privat; mendekripsi pesan dengan kunci privat dan memverifikasi dengan kunci publik untuk ini, kita perlu menambahkan e3kit ke aplikasi demo bersih kita dan beberapa kode lagi untuk menerapkan semua yang telah dijelaskan di atas tapi sebelum kita mulai, mari kita jelaskan dua istilah penting untuk anda apa itu kartu virgil dan kunci privat? kartu virgil kartu virgil menyimpan kunci privat pengguna kartu virgil diterbitkan ke layanan kartu virgil (bayangkan layanan ini seperti buku telepon) untuk diambil oleh pengguna lain alice perlu mengambil kunci publik bob untuk mengenkripsi pesan untuk bob menggunakan kunci itu kunci privat bagian privat dari kunci enkripsi ingat, kunci privat dapat mendekripsi data yang dienkripsi menggunakan kunci publik yang cocok 1 tambahkan e3kit ke e3kit back4app kotlin demo yang bersih di tingkat aplikasi ( modul app modul app ) gradle di /app/build gradle /app/build gradle tambahkan (tapi jangan sinkronkan skrip gradle dulu) tambahkan yang berikut di akhir /build gradle /build gradle tingkat proyek ( proyek chat back4app android proyek chat back4app android ) sekarang anda dapat menyinkronkan skrip gradle; perbarui appvirgil appvirgil kelas anda dengan menambahkan field baru tekan alt+ enter alt+ enter untuk mengimpor pustaka yang diperlukan ke dalam kelas 2 autentikasi pengguna dengan back4app cloud code di /virgilsecurity/virgilback4app/model/ /virgilsecurity/virgilback4app/model/ direktori, buat kelas data authenticateresponse authenticateresponse dan virgiljwtresponse virgiljwtresponse yang mewakili respons dari fungsi cloud code di /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ buat objek authrx authrx yang mengimplementasikan panggilan ke fungsi cloud code (jangan lupa untuk mengimpor semua pustaka yang diperlukan setelahnya) 1 object authrx { 2 3 / 4 you can call it only after successful \[authenticate] 5 / 6 fun virgiljwt(sessiontoken string) = single create\<string> { emitter > 7 val requestparams = mutablemapof\<string, string>() apply { 8 put("sessiontoken", sessiontoken) 9 } 10 11 parsecloud callfunctioninbackground\<map\<string, any>>( 12 key virgil jwt, 13 requestparams 14 ) { virgiljwt, exception > 15 if (exception == null) 16 emitter onsuccess(virgiljwt\[key token] tostring()) 17 else 18 emitter onerror(exception) 19 20 } 21 } 22 23 private const val key virgil jwt = "virgil jwt" 24 private const val key token = "token" 25 } 3 simpan virgil jwt secara lokal token virgil yang diterima dari fungsi cloud code perlu disimpan secara lokal mari kita perbarui preferences preferences kelas di /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ tentukan konstanta tambahkan fungsi setvirgiltoken setvirgiltoken , virgiltoken virgiltoken dan clearvirgiltoken clearvirgiltoken kotlin fun setvirgiltoken(virgiltoken string) { with(sharedpreferences edit()) { putstring(key virgil token, virgiltoken) apply() } } fun virgiltoken() string? { with(sharedpreferences) { return getstring(key virgil token, null) } } fun clearvirgiltoken() { with(sharedpreferences edit()) { remove(key virgil token) apply() } } 1 virgil token should be reset on logout let's add `preferences instance(this) clearvirgiltoken()` line into `initdrawer` function of `threadslistactivity` class (in ` /virgilsecurity/virgilback4app/chat/contactslist/`) 2 kotlin 3 private fun initdrawer() { 4 5 nvnavigation setnavigationitemselectedlistener { item > 6 r id itemlogout > { 7 dldrawer closedrawer(gravitycompat start) 8 presenter disposeall() 9 showbaseloading(true) 10 // new code >> 11 preferences instance(this) clearvirgiltoken() 12 // << new code 13 14 } 15 } 16 } 4 modifikasi pendaftaran pengguna e3kit mengurus kunci privat dan publik anda untuk menghasilkan mereka selama proses pendaftaran, kita perlu melakukan hal berikut di /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ buat rxethree rxethree kelas sekarang, tambahkan initethree initethree fungsi yang menginisialisasi instance e3kit di rxethree rxethree kelas 1 import com virgilsecurity android common model ethreeparams 2 import com virgilsecurity android ethree interaction ethree 3 4 5 fun initethree(identity string, verifyprivatekey boolean = false) 6single\<ethree> = single create { e > 6 val params = ethreeparams(identity, {preferences virgiltoken()!!}, context) 7 val ethree = ethree(params) 8 if (verifyprivatekey) { 9 if (ethree haslocalprivatekey()) { 10 e onsuccess(ethree) 11 } else { 12 e onerror(keyentrynotfoundexception()) 13 } 14 } else { 15 e onsuccess(ethree) 16 } 17 } tambahkan registerethree registerethree fungsi yang mendaftarkan pengguna baru ke rxethree rxethree kelas e3kit menghasilkan sepasang kunci selama pendaftaran kunci pribadi yang dihasilkan kemudian disimpan di penyimpanan lokal, dan kunci publik diterbitkan ke layanan virgil sebagai kartu virgil 1 import com android virgilsecurity virgilback4app appvirgil 2 import com virgilsecurity common callback oncompletelistener 3 import io reactivex completable 4 5 6 fun registerethree() completable = completable create { e > 7 appvirgil ethree register() addcallback(object oncompletelistener { 8 override fun onerror(throwable throwable) { 9 e onerror(throwable) 10 } 11 12 override fun onsuccess() { 13 e oncomplete() 14 } 15 16 }) 17 } mari kita lakukan beberapa pembaruan pada loginpresenter loginpresenter kelas (di /virgilsecurity/virgilback4app/auth/) /virgilsecurity/virgilback4app/auth/) tambahkan rxethree rxethree field 1 private val rxethree = rxethree(context) perbarui requestsignup requestsignup fungsi untuk menjalankan pendaftaran dengan e3kit 1 fun requestsignup(identity string, onsuccess () > unit, onerror (throwable) > unit) { 2 val password = generatepassword(identity tobytearray()) 3 4 val disposable = rxparse signup(identity, password) 5 subscribeon(schedulers io()) 6 observeon(schedulers io()) 7 // new code >> 8 tosingle { parseuser getcurrentuser() } 9 flatmap { authrx virgiljwt(it sessiontoken) } 10 map { preferences setvirgiltoken(it) } 11 flatmap { rxethree initethree(identity) } 12 map { appvirgil ethree = it } 13 flatmap { rxethree registerethree() tosingle { unit } } 14 // << new code 15 observeon(androidschedulers mainthread()) 16 // updated code >> 17 subscribeby( 18 onsuccess = { 19 onsuccess() 20 }, 21 onerror = { 22 onerror(it) 23 } 24 ) 25 // << updated code 26 27 compositedisposable += disposable 28 } 5 modifikasi fungsi masuk sekarang, mari kita buat perubahan pada requestsignin requestsignin metode dari loginpresenter loginpresenter kelas (di /virgilsecurity/virgilback4app/auth/) /virgilsecurity/virgilback4app/auth/) 1 fun requestsignin(identity string, 2 onsuccess () > unit, 3 onerror (throwable) > unit) { 4 5 val password = generatepassword(identity tobytearray()) 6 7 val disposable = rxparse login(identity, password) 8 subscribeon(schedulers io()) 9 observeon(schedulers io()) 10 // new code >> 11 flatmap { authrx virgiljwt(it sessiontoken) } 12 map { preferences setvirgiltoken(it) } 13 flatmap { rxethree initethree(identity, true) } 14 map { appvirgil ethree = it } 15 // << new code 16 observeon(androidschedulers mainthread()) 17 // updated code >> 18 subscribeby( 19 onsuccess = { 20 onsuccess() 21 }, 22 onerror = { 23 onerror(it) 24 } 25 ) 26 // << updated code 27 28 compositedisposable += disposable 29 } 6 dapatkan daftar chat yang ada selanjutnya, tambahkan fungsi yang menangani inisialisasi e3kit ke dalam threadslistfragment threadslistfragment kelas (di /virgilsecurity/virgilback4app/chat/contactslist/) /virgilsecurity/virgilback4app/chat/contactslist/) 1 private fun oninitethreesuccess() { 2 presenter requestthreads(parseuser getcurrentuser(), 3 20, 4 page, 5 const tablenames created at criteria, 6 ongetthreadssuccess, 7 ongetthreadserror) 8 } 9 10 private fun oninitethreeerror(throwable throwable) { 11 showprogress(false) 12 if (adapter itemcount == 0) 13 tverror visibility = view\ visible 14 15 utils toast(activity, utils resolveerror(throwable)) 16 } perbarui postcreateinit postcreateinit fungsi untuk menginisialisasi e3kit 1 override fun postcreateinit() { 2 3 presenter = threadslistfragmentpresenter(activity) 4 5 showprogress(true) 6 // updated code >> 7 if (appvirgil isethreeinitialized()) { 8 presenter requestthreads(parseuser getcurrentuser(), 9 20, 10 page, 11 const tablenames created at criteria, 12 ongetthreadssuccess, 13 ongetthreadserror) 14 } else { 15 presenter requestethreeinit(parseuser getcurrentuser(), oninitethreesuccess, oninitethreeerror) 16 } 17 // << updated code 18 } dan tambahkan kode berikut ke dalam threadslistfragmentpresenter threadslistfragmentpresenter kelas di virgilsecurity virgilback4app chat contactslist/ virgilsecurity virgilback4app chat contactslist/ tambahkan field 1 private val rxethree = rxethree(context) dan fungsi 1 fun requestethreeinit(currentuser parseuser, onsuccess () > unit, onerror (throwable) > unit) { 2 val disposable = rxethree initethree(currentuser username) 3 subscribeon(schedulers io()) 4 observeon(androidschedulers mainthread()) 5 subscribeby( 6 onsuccess = { 7 appvirgil ethree = it 8 onsuccess() 9 }, 10 onerror = { 11 onerror(it) 12 } 13 ) 14 15 compositedisposable += disposable 16 } pada titik ini, kami dapat mendaftar/memasukkan pengguna dan membuat obrolan baru dengan pengguna lain sekarang mari kita tambahkan enkripsi untuk pesan kita 7 enkripsi dan dekripsi pesan mari kita tambahkan findcard findcard fungsi ke rxethree rxethree kelas (di /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ ) yang akan membantu kita mendapatkan kartu virgil terbaru berdasarkan nama pengguna 1 fun findcard(identity string) single\<card> = single create { e > 2 appvirgil ethree finduser(identity) addcallback(object onresultlistener\<card> { 3 override fun onerror(throwable throwable) { 4 e onerror(throwable) 5 } 6 7 override fun onsuccess(result card) { 8 e onsuccess(result) 9 } 10 11 }) 12 } ketika obrolan dibuka, kita harus mendapatkan kartu virgil dari penerima edit postcreateinit postcreateinit dari chatthreadfragment chatthreadfragment kelas (di /virgilsecurity/virgilback4app/chat/thread/ /virgilsecurity/virgilback4app/chat/thread/ ) dengan mengganti 1 presenter requestmessages(thread, 2 50, 3 page, 4 const tablenames created at criteria, 5 ongetmessagessuccess, 6 ongetmessageserror) kode dengan yang baru 1 presenter requestcard(recipientid, 2 ongetcardsuccess, 3 ongetcarderror) dan tambahkan dua fungsi 1 private fun ongetcardsuccess(card card) { 2 showprogress(false) 3 adapter interlocutorcard = card 4 presenter requestmessages(thread, 5 50, 6 page, 7 const tablenames created at criteria, 8 ongetmessagessuccess, 9 ongetmessageserror) 10 } 11 12 private fun ongetcarderror(t throwable) { 13 if (t is virgilcardisnotfoundexception || t is virgilcardserviceexception) { 14 utils toast(this, 15 "virgil card is not found \nyou can not chat with user without virgil card") 16 activity onbackpressed() 17 } 18 showprogress(false) 19 srlrefresh isrefreshing = false 20 locksendui(lock = false, lockinput = false) 21 22 utils toast(this, utils resolveerror(t)) 23 } sekarang mari kita ubah chatthreadpresenter chatthreadpresenter tambahkan bidang 1 private val ethree = appvirgil ethree 2 private lateinit var usercard card 3 private val rxethree = rxethree(context) tambahkan fungsi yang mendapatkan kartu virgil dari penerima 1 fun requestcard(identity string, 2 onsuccess (card) > unit, 3 onerror (throwable) > unit) { 4 5 val disposable = rxethree findcard(identity) 6 subscribeon(schedulers io()) 7 observeon(androidschedulers mainthread()) 8 subscribeby( 9 onsuccess = { 10 usercard = it 11 onsuccess(it) 12 }, 13 onerror = { 14 onerror(it) 15 } 16 ) 17 18 compositedisposable += disposable 19 } tambahkan enkripsi pesan yang keluar di requestsendmessage requestsendmessage fungsi 1 fun requestsendmessage(text string, 2 thread chatthread, 3 onsuccess () > unit, 4 onerror (throwable) > unit) { 5 6 val encryptedtext = ethree authencrypt(text, usercard) 7 val disposable = rxparse sendmessage(encryptedtext, thread) 8 9 } tambahkan dekripsi semua pesan yang masuk ke dalam chatthreadrvadapter chatthreadrvadapter kelas (di /virgilsecurity/virgilback4app/chat/thread/) /virgilsecurity/virgilback4app/chat/thread/) tambahkan bidang 1 private var ethree ethree = appvirgil ethree 2 lateinit var interlocutorcard card implementasikan dekripsi pesan di onbindviewholder onbindviewholder fungsi 1 override fun onbindviewholder(viewholder recyclerview\ viewholder, position int) { 2 when (viewholder) { 3 is holdermessageme > { 4 val decryptedtext = ethree authdecrypt(items\[position] body) 5 viewholder bind(decryptedtext) 6 } 7 is holdermessageyou > { 8 val decryptedtext = ethree authdecrypt(items\[position] body, interlocutorcard) 9 viewholder bind(decryptedtext) 10 } 11 } 12 } 8 jalankan demo terenkripsi end to end yang lengkap sekarang untuk melihat hasil demo kami yang sepenuhnya terenkripsi end to end, ikuti langkah langkah ini lagi keluar dari pengguna sebelumnya daftar 2 pengguna baru; mulai percakapan antara mereka dan kirim beberapa pesan; buka back4app “dashboard” > “core” > “database browser” > “message” penting! anda harus keluar dari pengguna saat ini dan mendaftar dua pengguna baru, setelah itu anda dapat memulai obrolan e2ee dengan dua pengguna baru tersebut alasannya adalah bahwa dua pengguna pertama anda tidak memiliki kartu virgil kartu virgil ’s, jadi anda tidak dapat menggunakan enkripsi\dekripsi untuk mereka { blockquote tip} selesai! sekarang anda dapat melihat bahwa pesan pengguna terenkripsi dan hanya dapat diakses dalam aplikasi oleh pengguna itu sendiri kepatuhan hipaa & gdpr enkripsi end to end adalah cara untuk memenuhi persyaratan teknis untuk hipaa (undang undang portabilitas dan akuntabilitas asuransi kesehatan amerika serikat tahun 1996) & gdpr (regulasi perlindungan data umum uni eropa) jika anda memerlukan lebih banyak detail, daftar untuk akun virgil https //developer virgilsecurity com/account/signup?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat , bergabunglah dengan komunitas slack kami dan hubungi kami di sana kami senang untuk membahas keadaan privasi anda sendiri dan membantu anda memahami apa yang diperlukan untuk memenuhi persyaratan teknis hipaa & gdpr kemana selanjutnya? proyek akhir https //github com/virgilsecurity/chat back4app android/ jika anda melewatkan bagian dari teka teki, buka cabang proyek e2ee anda dapat memasukkan kredensial aplikasi anda dalam kode ini (seperti yang anda lakukan selama artikel) dan membangun proyek anda dapat menemukan lebih banyak informasi tentang apa yang dapat anda bangun dengan virgil security di sini https //virgilsecurity com/?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat