Security & Privacy
พัฒนาแอปแชทเข้ารหัส End-to-End ด้วย Back4App
49 นาที
วิธีการสร้างแอปแชทที่สอดคล้องกับ gdpr บทนำ สวัสดีชุมชน back4app! นี่คือบทเรียนจากทีมที่ virgil security, inc https //virgilsecurity com/?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat เราคือเทคโนโลยีการเข้ารหัสที่อยู่เบื้องหลัง การส่งข้อความที่เข้ารหัสแบบ end to end ของ twilio https //www twilio com/blog/2016/05/introducing end to end encryption for twilio ip messaging with virgil security html เพื่อนของเราที่ back4app ขอให้เราสอนวิธีสร้างแอปแชทที่เข้ารหัสแบบ end to end บน back4app ในโพสต์นี้ เราจะพาคุณผ่านขั้นตอนในการสร้างแอป messenger android ที่เรียบง่ายของ back4app ให้เข้ารหัสแบบ end to end! คุณพร้อมหรือยัง? ps หากคุณไม่สนใจรายละเอียด สามารถข้ามไปที่ตอนท้ายของโพสต์และดาวน์โหลดผลิตภัณฑ์สุดท้ายได้เลย การเข้ารหัสแบบ end to end คืออะไร? ก่อนอื่น มาทบทวนกันอย่างรวดเร็วว่า e2ee (การเข้ารหัสแบบ end to end) คืออะไรและทำงานอย่างไร e2ee นั้นง่าย เมื่อคุณพิมพ์ข้อความในแชท ข้อความจะถูกเข้ารหัสบนอุปกรณ์มือถือของคุณ (หรือในเบราว์เซอร์ของคุณ) และจะถูกถอดรหัสเมื่อคู่สนทนาของคุณได้รับและต้องการแสดงในหน้าต่างแชท ข้อความจะยังคงถูกเข้ารหัสขณะเดินทางผ่าน wi fi และอินเทอร์เน็ต ผ่านคลาวด์ / เว็บเซิร์ฟเวอร์ ไปยังฐานข้อมูล และกลับไปยังคู่สนทนาของคุณ กล่าวอีกนัยหนึ่ง ไม่มีเครือข่ายหรือเซิร์ฟเวอร์ใดที่รู้ว่าคุณสองคนกำลังสนทนาเกี่ยวกับอะไร สิ่งที่ยากในเรื่องการเข้ารหัสแบบ end to end คือการจัดการกุญแจการเข้ารหัสในลักษณะที่ผู้ใช้ที่เกี่ยวข้องในแชทสามารถเข้าถึงได้เท่านั้นและไม่มีใครอื่น และเมื่อฉันพูดว่า “ไม่มีใครอื่น” ฉันหมายถึงจริงๆ แม้แต่คนในองค์กรของผู้ให้บริการคลาวด์ของคุณหรือแม้แต่คุณ นักพัฒนา ก็ไม่สามารถเข้าถึงได้; ไม่มีข้อผิดพลาดที่เกิดขึ้นโดยบังเอิญ https //techcrunch com/2017/11/29/meet the man who deactivated trumps twitter account/ หรือการมองเห็นที่บังคับตามกฎหมายเป็นไปไม่ได้ การเขียนโค้ดการเข้ารหัส โดยเฉพาะสำหรับหลายแพลตฟอร์ม เป็นเรื่องยาก การสร้างหมายเลขสุ่มที่แท้จริง การเลือกอัลกอริธึมที่ถูกต้อง และการเลือกโหมดการเข้ารหัสที่ถูกต้องเป็นเพียงไม่กี่ตัวอย่างที่ทำให้ผู้พัฒนาส่วนใหญ่ยกมือขึ้นในอากาศและลงเอยด้วยการไม่ทำมัน บล็อกโพสต์นี้จะแสดงให้คุณเห็นว่าคุณจะละเลยรายละเอียดที่น่ารำคาญทั้งหมดนี้และเข้ารหัสแบบ end to end อย่างรวดเร็วและง่ายดายโดยใช้ sdk ของ virgil สำหรับการแนะนำ นี่คือวิธีที่เราจะอัปเกรดแอปส่งข้อความของ back4app ให้เป็นการเข้ารหัสแบบ end to end ในระหว่างการลงทะเบียน เราจะสร้างกุญแจส่วนตัวและกุญแจสาธารณะสำหรับผู้ใช้ใหม่ (จำไว้ว่า กุญแจสาธารณะของผู้รับจะเข้ารหัสข้อความและกุญแจส่วนตัวที่ตรงกันของผู้รับจะถอดรหัสข้อความนั้น) ก่อนส่งข้อความ คุณจะเข้ารหัสข้อความแชทด้วยกุญแจสาธารณะของผู้รับ หลังจากได้รับข้อความ คุณจะถอดรหัสข้อความแชทด้วยกุญแจส่วนตัวของผู้รับ เราจะเผยแพร่กุญแจสาธารณะของผู้ใช้ไปยังบริการการ์ดของ virgil เพื่อให้ผู้ใช้แชทสามารถค้นหากันและสามารถเข้ารหัสข้อความให้กันได้ กุญแจส่วนตัวจะอยู่บนอุปกรณ์ของผู้ใช้ ทำให้มันง่าย นี่คือการนำไปใช้ e2ee แชทที่ง่ายที่สุดและมันทำงานได้อย่างสมบูรณ์แบบสำหรับแอปแชทง่ายๆ ระหว่างผู้ใช้ 2 คน ซึ่งการสนทนามีอายุสั้นและมันก็โอเคที่จะสูญเสียประวัติข้อความหากอุปกรณ์สูญหายพร้อมกับกุญแจส่วนตัวบนมัน โอเค พอพูดคุยกันแล้ว! มาลงมือเขียนโค้ดกันเถอะ เราจะเริ่มต้นด้วยการแนะนำคุณเกี่ยวกับการตั้งค่าแอป android, จากนั้นเราจะเพิ่มโค้ดบางส่วนเพื่อทำให้แอปเข้ารหัสแบบ end to end ข้อกำหนดเบื้องต้น ในการทำตามบทเรียนนี้ คุณต้องการ android studio แอปที่สร้างขึ้นที่ back4app ติดตาม บทเรียนการสร้างแอปใหม่ เพื่อเรียนรู้วิธีการสร้างแอปที่ back4app ลงทะเบียนสำหรับ บัญชี virgil security (เราจะสร้างแอปในภายหลัง) มาตั้งค่าแอปพลิเคชัน back4app messenger ที่ “สะอาด” 1 ตั้งค่า app server ของคุณ เริ่มต้นด้วยการปรับใช้ฟังก์ชันคลาวด์ สำหรับสิ่งนี้ คุณจะต้อง ค้นหา main js main js และ package json package json ใน scripts scripts ไดเรกทอรี; เปิด main js main js ด้วยโปรแกรมแก้ไขที่คุณชื่นชอบ 1 1) รับข้อมูลประจำตัว back4app เปิด แดชบอร์ด แดชบอร์ด ของแอปของคุณ > การตั้งค่าแอป การตั้งค่าแอป > ความปลอดภัย & คีย์ ความปลอดภัย & คีย์ ใน main js main js , แทนที่ parse app id parse app id ด้วย application id application id และ parse rest api key parse rest api key ด้วย rest api key rest api key 1 2) รับข้อมูลรับรอง virgil สร้างแอปพลิเคชันที่ virgil dashboard https //dashboard virgilsecurity com/ เปิดแอปพลิเคชัน virgil ใหม่ของคุณ ไปที่ส่วน e3kit และสร้าง env env ไฟล์ภายใต้ส่วน e3kit ในแถบด้านซ้าย คัดลอกค่าของ app id app id , app key app key , และ app key id app key id จาก env env ไฟล์ แทนที่ค่าที่คัดลอกใน main js main js ไฟล์ในฟิลด์ที่เกี่ยวข้อง ( main js main js ของ scripts scripts ไดเรกทอรี) 1 3) ปรับใช้ฟังก์ชันโค้ดคลาวด์ เปิด back4app “แดชบอร์ด” ของแอปของคุณ > “core” > ฟังก์ชันโค้ดคลาวด์; คลิก +add และเลือก main js และ package json (จากไดเรกทอรีสคริปต์) หลังจากนั้นย้ายทั้งสองไปยังโฟลเดอร์คลาวด์; คลิก deploy 2 เริ่มแอปตัวอย่าง back4app kotlin ที่สะอาด อย่าลืมตั้งค่าฟังก์ชันโค้ดคลาวด์ back4app ก่อน มันเป็นส่วนที่จำเป็นของการสาธิตนี้ หลังจากนี้ให้ทำตามขั้นตอนต่อไปนี้ 2 1) นำเข้าโปรเจกต์ใน android studio เปิด android studio > ไฟล์ ไฟล์ > ใหม่ ใหม่ > โปรเจกต์จากการควบคุมเวอร์ชัน โปรเจกต์จากการควบคุมเวอร์ชัน > git git url ของ git repository https //github com/virgilsecurity/chat back4app android ตรวจสอบสาขา clean chat kt clean chat kt สำคัญ! เลือกประเภทไฟล์ต้นไม้ “โปรเจกต์” มันจะถูกใช้ตลอดทั้งบทเรียน 2 2) ตั้งค่าข้อมูลประจำตัว back4app ในโปรเจกต์ เปิด “แดชบอร์ด” ของ back4app ของแอปของคุณ > “การตั้งค่าแอป” > “ความปลอดภัย & คีย์”; ไปที่ /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml ไฟล์ในโปรเจกต์แอนดรอยด์ของคุณและแทนที่ your back4app app id your back4app app id ด้วย application id application id และ your back4app client key your back4app client key ด้วย client key client key 2 3) ตั้งค่า db เปิด back4app “แดชบอร์ด” > “หลัก” > “เบราว์เซอร์ฐานข้อมูล” > “สร้างคลาส” และสร้างคลาสประเภท custom custom ชื่อ message message และ chatthread chatthread ; 2 4) ตั้งค่าคำถามสด กลับไปที่ บัญชี back4app https //dashboard back4app com/apps/#!/admin กดปุ่ม การตั้งค่าเซิร์ฟเวอร์ การตั้งค่าเซิร์ฟเวอร์ บนแอปพลิเคชันของคุณ ค้นหาบล็อก “การโฮสต์เว็บและคำถามสด” เปิดการตั้งค่าคำถามสดและตรวจสอบ เปิดใช้งานการโฮสต์ เปิดใช้งานการโฮสต์ ตัวเลือก เลือกชื่อสำหรับซับโดเมนของคุณเพื่อเปิดใช้งานคำถามสดสำหรับ 2 คลาสที่คุณสร้าง ข้อความ ข้อความ และ กระทู้แชท กระทู้แชท คัดลอกชื่อซับโดเมนใหม่ของคุณและคลิกปุ่มบันทึก กลับไปที่ /app/src/main/res/values/strings xml /app/src/main/res/values/strings xml และวาง “ชื่อซับโดเมน” ที่คุณได้กรอกไว้ข้างต้นลงใน back4app live query url back4app live query url แทนที่ “yoursubdomainname” หลังจากขั้นตอนเหล่านี้ คุณจะสามารถกดปุ่ม run ใน android studio และทำให้ตัวอย่างทำงานได้ ใช้โปรแกรมจำลองหรืออุปกรณ์จริงเพื่อลองใช้งาน 3 รันเดโมที่สะอาด เพื่อดูผลลัพธ์ของการรันเวอร์ชันที่สะอาดของเดโม คุณจะต้อง ลงทะเบียนผู้ใช้ 2 คน; เริ่มการสนทนาระหว่างพวกเขาและส่งข้อความสองสามข้อความ; 3\ เปิด back4app “dashboard” > “core” > “database browser” > “message” ถ้าทุกอย่างทำงานได้ คุณควรเห็นแอปแชทเมสเซนเจอร์ปรากฏขึ้น ลงทะเบียนผู้ใช้สองคนและส่งข้อความไม่กี่ข้อความถึงกัน คุณควรเห็นข้อมูลใหม่ปรากฏใน message message คลาส โปรดทราบว่าคุณสามารถดูได้ในเซิร์ฟเวอร์ว่าผู้ใช้ของคุณกำลังสนทนาเกี่ยวกับอะไร ถัดไป ปิดอินเตอร์เฟซแชทของคุณและไปยังขั้นตอนถัดไป – การเพิ่มการเข้ารหัส e2ee ตอนนี้ มาทำการเข้ารหัสแบบ end to end สำหรับข้อความเหล่านั้นกันเถอะ! เมื่อสิ้นสุดส่วนนี้ ข้อความแชทของคุณจะมีลักษณะเช่นนี้บนเซิร์ฟเวอร์ คุณสามารถสังเกตเห็นความแตกต่างได้ไหม? เราจะไปถึงจุดนั้นได้อย่างไร? ชัดเจนว่าเราต้องดำเนินการเข้ารหัสแบบ end to end ซึ่งหมายความว่าแอปของเราต้อง สร้างคู่กุญแจส่วนตัวและสาธารณะเป็นส่วนหนึ่งของการลงทะเบียน เก็บกุญแจส่วนตัวในที่เก็บกุญแจบนอุปกรณ์ของผู้ใช้ เผยแพร่กุญแจสาธารณะในบริการการ์ดของ virgil เป็น “virgil card” เพื่อให้ผู้ใช้อื่นดาวน์โหลดและเข้ารหัสข้อความด้วยมัน เข้ารหัสข้อความด้วยกุญแจสาธารณะและลงนามด้วยกุญแจส่วนตัว; ถอดรหัสข้อความด้วยกุญแจส่วนตัวและตรวจสอบด้วยกุญแจสาธารณะ สำหรับสิ่งนี้ เราจะต้องเพิ่ม e3kit ลงในแอปพลิเคชันสาธิตที่สะอาดของเราและเขียนโค้ดเพิ่มเติมเพื่อดำเนินการตามที่ได้อธิบายไว้ข้างต้น แต่ก่อนที่เราจะเริ่ม มาทำความเข้าใจสองคำสำคัญสำหรับคุณ virgil card และกุญแจส่วนตัวคืออะไร? virgil card virgil cards ถือกุญแจส่วนตัวของผู้ใช้ virgil cards ถูกเผยแพร่ไปยังบริการการ์ดของ virgil (จินตนาการว่าบริการนี้เหมือนสมุดโทรศัพท์) เพื่อให้ผู้ใช้อื่นสามารถดึงข้อมูลได้ อลิซต้องดึงกุญแจสาธารณะของบ็อบเพื่อเข้ารหัสข้อความสำหรับบ็อบโดยใช้กุญแจนั้น กุญแจส่วนตัว ส่วนที่เป็นส่วนตัวของกุญแจการเข้ารหัส จำไว้ว่ากุญแจส่วนตัวสามารถถอดรหัสข้อมูลที่ถูกเข้ารหัสโดยใช้กุญแจสาธารณะที่ตรงกัน 1 เพิ่ม e3kit ลงใน e3kit back4app kotlin demo ที่สะอาด ในระดับแอป ( โมดูล app โมดูล app ) gradle ที่ /app/build gradle /app/build gradle เพิ่ม (แต่ยังไม่ซิงค์สคริปต์ gradle) เพิ่มสิ่งต่อไปนี้ที่ท้ายระดับโปรเจกต์ของคุณ /build gradle /build gradle ( โปรเจกต์ chat back4app android โปรเจกต์ chat back4app android ) ตอนนี้คุณสามารถซิงค์สคริปต์ gradle ได้; อัปเดต appvirgil appvirgil คลาสของคุณโดยการเพิ่มฟิลด์ใหม่ กด alt+ enter alt+ enter เพื่อนำเข้าห้องสมุดที่จำเป็นเข้าสู่คลาส 2 ยืนยันตัวตนผู้ใช้ด้วย back4app cloud code ใน /virgilsecurity/virgilback4app/model/ /virgilsecurity/virgilback4app/model/ ไดเรกทอรี สร้างคลาสข้อมูล authenticateresponse authenticateresponse และ virgiljwtresponse virgiljwtresponse ที่แทนการตอบสนองจากฟังก์ชัน cloud code ใน /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ สร้าง authrx authrx อ็อบเจ็กต์ที่เรียกใช้ฟังก์ชัน cloud code (อย่าลืมนำเข้าห้องสมุดที่จำเป็นทั้งหมดหลังจากนั้น) 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 เก็บ virgil jwt ไว้ในเครื่อง โทเค็น virgil ที่ได้รับจากฟังก์ชัน cloud code จำเป็นต้องถูกเก็บไว้ในเครื่อง มาทำการอัปเดต preferences preferences คลาสใน /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ กำหนดค่าคงที่ เพิ่มฟังก์ชัน setvirgiltoken setvirgiltoken , virgiltoken virgiltoken และ 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 แก้ไขการลงทะเบียนผู้ใช้ e3kit ดูแลเกี่ยวกับกุญแจส่วนตัวและกุญแจสาธารณะของคุณ เพื่อสร้างพวกมันในระหว่างกระบวนการลงทะเบียน เราจะต้องทำตามขั้นตอนดังต่อไปนี้ ใน /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ สร้าง rxethree rxethree คลาส ตอนนี้ เพิ่ม initethree initethree ฟังก์ชันที่เริ่มต้นอินสแตนซ์ e3kit ใน rxethree rxethree คลาส 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 } เพิ่ม registerethree registerethree ฟังก์ชันที่ลงทะเบียนผู้ใช้ใหม่ใน rxethree rxethree คลาส。 e3kit สร้างคู่กุญแจระหว่างการลงทะเบียน กุญแจส่วนตัวที่สร้างขึ้นจะถูกเก็บในที่เก็บข้อมูลท้องถิ่น และกุญแจสาธารณะจะถูกเผยแพร่ไปยังบริการ virgil ในฐานะ virgil card 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 } มาทำการอัปเดต loginpresenter loginpresenter คลาส (ใน /virgilsecurity/virgilback4app/auth/) /virgilsecurity/virgilback4app/auth/) เพิ่ม rxethree rxethree ฟิลด์ 1 private val rxethree = rxethree(context) อัปเดต requestsignup requestsignup ฟังก์ชันเพื่อทำการลงทะเบียนด้วย 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 แก้ไขฟังก์ชันการลงชื่อเข้าใช้ ตอนนี้ มาทำการเปลี่ยนแปลงใน requestsignin requestsignin วิธีการของ loginpresenter loginpresenter คลาส (ใน /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 รับรายชื่อแชทที่มีอยู่ ถัดไป เพิ่มฟังก์ชันที่จัดการการเริ่มต้น e3kit ลงใน threadslistfragment threadslistfragment คลาส (ใน /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 } อัปเดต postcreateinit postcreateinit ฟังก์ชันเพื่อเริ่มต้น 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 } และเพิ่มโค้ดต่อไปนี้ลงใน threadslistfragmentpresenter threadslistfragmentpresenter คลาสใน virgilsecurity virgilback4app chat contactslist/ virgilsecurity virgilback4app chat contactslist/ เพิ่มฟิลด์ 1 private val rxethree = rxethree(context) และฟังก์ชัน 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 } ในจุดนี้เราสามารถลงทะเบียน/เข้าสู่ระบบผู้ใช้และสร้างการสนทนาใหม่กับผู้ใช้อื่นได้แล้ว ตอนนี้เรามาเพิ่มการเข้ารหัสสำหรับข้อความของเรากันเถอะ 7 การเข้ารหัสและถอดรหัสข้อความ เรามาเพิ่ม findcard findcard ฟังก์ชันไปยัง rxethree rxethree คลาส (ใน /virgilsecurity/virgilback4app/util/ /virgilsecurity/virgilback4app/util/ ) ที่จะช่วยให้เราได้รับการ์ด virgil ล่าสุดโดยใช้ชื่อผู้ใช้ 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 } เมื่อเปิดแชท เราควรได้รับการ์ดของผู้รับ แก้ไข postcreateinit postcreateinit ของ chatthreadfragment chatthreadfragment คลาส (ใน /virgilsecurity/virgilback4app/chat/thread/ /virgilsecurity/virgilback4app/chat/thread/ ) โดยการแทนที่ 1 presenter requestmessages(thread, 2 50, 3 page, 4 const tablenames created at criteria, 5 ongetmessagessuccess, 6 ongetmessageserror) โค้ดด้วยโค้ดใหม่ 1 presenter requestcard(recipientid, 2 ongetcardsuccess, 3 ongetcarderror) และเพิ่มฟังก์ชันสองตัว 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 } ตอนนี้เรามาเปลี่ยน chatthreadpresenter chatthreadpresenter เพิ่มฟิลด์ 1 private val ethree = appvirgil ethree 2 private lateinit var usercard card 3 private val rxethree = rxethree(context) เพิ่มฟังก์ชันที่ได้รับการ์ด virgil ของผู้รับ 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 } เพิ่มการเข้ารหัสข้อความที่ส่งออกใน requestsendmessage requestsendmessage ฟังก์ชัน 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 } เพิ่มการถอดรหัสข้อความที่เข้ามาทั้งหมดไปยัง chatthreadrvadapter chatthreadrvadapter คลาส (ใน /virgilsecurity/virgilback4app/chat/thread/) /virgilsecurity/virgilback4app/chat/thread/) เพิ่มฟิลด์ 1 private var ethree ethree = appvirgil ethree 2 lateinit var interlocutorcard card ดำเนินการถอดรหัสข้อความใน onbindviewholder onbindviewholder ฟังก์ชัน 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 รันเดโมการเข้ารหัสแบบ end to end ที่สมบูรณ์ ตอนนี้เพื่อดูผลลัพธ์ของการสาธิตที่เข้ารหัสแบบ end to end อย่างเต็มรูปแบบของเรา ให้ทำตามขั้นตอนเหล่านี้อีกครั้ง ออกจากระบบผู้ใช้ก่อนหน้า ลงทะเบียนผู้ใช้ใหม่ 2 คน; เริ่มการสนทนาระหว่างพวกเขาและส่งข้อความสองสามข้อความ; เปิด back4app “แดชบอร์ด” > “core” > “database browser” > “message” สำคัญ! คุณต้อง ออกจากระบบ ผู้ใช้ปัจจุบันและลงทะเบียนผู้ใช้ใหม่สองคน หลังจากนั้นคุณสามารถเริ่มการสนทนา e2ee กับผู้ใช้ใหม่สองคนนี้ได้ สาเหตุคือผู้ใช้สองคนแรกของคุณไม่มี virgil card virgil card ดังนั้นคุณจึงไม่สามารถใช้การเข้ารหัส\ถอดรหัสสำหรับพวกเขาได้ { blockquote tip} เสร็จสิ้น! ตอนนี้คุณสามารถเห็นว่าข้อความของผู้ใช้ถูกเข้ารหัสและสามารถเข้าถึงได้ในแอปโดยผู้ใช้เองเท่านั้น การปฏิบัติตาม hipaa & gdpr การเข้ารหัสแบบ end to end เป็นวิธีการที่ตอบสนองความต้องการทางเทคนิคสำหรับ hipaa (พระราชบัญญัติการประกันสุขภาพที่สามารถเคลื่อนย้ายและรับผิดชอบของสหรัฐอเมริกาในปี 1996) & gdpr (ระเบียบการคุ้มครองข้อมูลทั่วไปของสหภาพยุโรป) หากคุณต้องการรายละเอียดเพิ่มเติม ลงทะเบียนเพื่อรับ บัญชี virgil https //developer virgilsecurity com/account/signup?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat , เข้าร่วมชุมชน slack ของเราและติดต่อเราที่นั่น เรายินดีที่จะพูดคุยเกี่ยวกับสถานการณ์ความเป็นส่วนตัวของคุณและช่วยให้คุณเข้าใจสิ่งที่จำเป็นเพื่อให้เป็นไปตามข้อกำหนดทางเทคนิคของ hipaa & gdpr จะไปที่ไหนจากที่นี่? โครงการสุดท้าย https //github com/virgilsecurity/chat back4app android/ หากคุณพลาดชิ้นส่วนจากปริศนา ให้เปิดสาขาโครงการ e2ee คุณสามารถใส่ข้อมูลประจำตัวแอปพลิเคชันของคุณในโค้ดนี้ (ตามที่คุณทำในระหว่างบทความ) และสร้างโครงการ คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณสามารถสร้างด้วย virgil security ที่นี่ https //virgilsecurity com/?utm source=back4app\&utm medium=blog\&utm campaign=e2eechat