การออกแบบด้านความปลอดภัย
ล็อกบนโทรศัพท์
และเปิดบนโทรศัพท์
โพสต์ รูป และแชทถูกผนึกก่อนออกจากโทรศัพท์ และเปิดได้เฉพาะคนที่คุณเลือก การที่คุณรู้จักกับใครอยู่ในโทรศัพท์ของแต่ละคน และเซิร์ฟเวอร์ไม่เก็บไว้
01 ผนึก
เปิดได้เฉพาะ
คนที่คุณเลือก
เมื่อคุณโพสต์ โทรศัพท์จะผนึกก่อนแล้วจึงส่ง เซิร์ฟเวอร์ทำแค่เก็บและส่งต่อโพสต์ที่ผนึกไว้ โดยไม่มีกุญแจที่จะเปิด คำตอบ รูป วิดีโอ และตัวอย่างลิงก์ก็เดินทางแบบเดียวกัน
โทรศัพท์ของผู้เขียนสร้างกุญแจเนื้อหาใหม่สำหรับโพสต์นี้โดยเฉพาะ ภายในแกนความปลอดภัย
แล้วใช้กุญแจนั้นล็อกข้อความ รูป และวิดีโอ ข้อความจะถูกเติมให้ได้ขนาดที่กำหนดก่อนล็อก เพื่อไม่ให้ความยาวจริงปรากฏ
จากนั้นผนึกกุญแจเนื้อหาด้วยกุญแจเข้ารหัสของผู้รับแต่ละคน ได้เป็นซองหนึ่งซองต่อหนึ่งคน ผู้เขียนเองก็มีซองหนึ่งซองด้วย
เซิร์ฟเวอร์รับข้อความเข้ารหัสและซองมาเก็บไว้ แล้วส่งต่อให้ผู้รับ กุญแจที่เปิดซองมีอยู่แค่ในโทรศัพท์ของผู้รับ เซิร์ฟเวอร์จึงเปิดไม่ได้
โทรศัพท์ของผู้รับเปิดซองของตัวเองภายในแกนความปลอดภัย แล้วนำกุญแจเนื้อหาออกมา
แล้วใช้กุญแจนั้นปลดล็อกโพสต์และแสดงบนหน้าจอ
- บนเซิร์ฟเวอร์มีแต่ข้อความเข้ารหัส
- โพสต์ คำตอบ รูป วิดีโอ และตัวอย่างลิงก์ถูกล็อกไว้แล้วก่อนถึงเซิร์ฟเวอร์
- ผู้อ่านแต่ละคนมีซองของตัวเอง
- กุญแจของโพสต์ถูกใส่ลงซองแยกกันสำหรับผู้อ่านแต่ละคน และซองนั้นเปิดได้เฉพาะโทรศัพท์ของคนนั้น
- กุญแจใหม่ทุกโพสต์
- ทุกโพสต์และทุกคำตอบมีกุญแจใหม่ของตัวเอง กุญแจของโพสต์หนึ่งเปิดโพสต์อื่นไม่ได้
- โทรศัพท์ของคุณเป็นผู้กำหนดผู้รับ
- โทรศัพท์ของคุณผนึกโพสต์ให้รายชื่อ Fam ที่มันเก็บไว้เอง คนที่จะอยู่ในรายชื่อนั้นได้มีเพียงคนที่ตอบรับคำขอ หรือเชื่อมกันผ่านคิวอาร์โค้ดหรือลิงก์ Fam ลิงก์ Fam ที่คุณส่งใช้ได้ครั้งเดียวภายใน 24 ชั่วโมง และคนแรกที่เปิดจะเป็น Fam โดยไม่ต้องให้คุณยืนยัน การส่งลิงก์ถือเป็นการยินยอม
โพสต์ล็อกด้วย XChaCha20-Poly1305 ซองแต่ละซองผนึกด้วย X25519 แล้วใส่ไว้ในความลับของคู่ ซึ่งแบ่งกันด้วย X25519 กับ ML-KEM-768 พร้อมกัน
02 ความสัมพันธ์
การรู้จักกับใคร
อยู่แค่ในโทรศัพท์
รายชื่อ Fam ของคุณถูกผนึกบนโทรศัพท์ เซิร์ฟเวอร์ไม่เก็บว่าใครพาใครเข้ามา หรือใครส่งอะไรถึงใคร สิ่งที่ผนึกไว้เดินทางผ่านตู้จดหมายที่ไม่ได้ผูกกับบัญชีใดเลย แต่ในขณะที่คำขอมาถึง เซิร์ฟเวอร์ก็เห็นที่อยู่ IP และเวลา ซึ่งอาจใช้โยงตู้จดหมายเข้ากับบัญชีได้ สำหรับคนที่ทีม Krypton พาเข้ามาเอง เซิร์ฟเวอร์จะเก็บไว้ว่าทีมเป็นผู้พาเข้ามา
- ความลับที่รู้กันแค่สองเครื่อง
- เมื่อสองคนเป็น Fam กัน โทรศัพท์ทั้งสองเครื่องจะแบ่งความลับที่เซิร์ฟเวอร์มองไม่เห็น ทุกอย่างที่ส่งถึงกันใช้ความลับนี้หาทาง
- ตู้จดหมาย ไม่ใช่บัญชี
- โพสต์ แชท และนามบัตรเข้าไปอยู่ในตู้จดหมายที่ไม่ได้ผูกกับบัญชีใดเลย และหมายเลขตู้จดหมายเปลี่ยนทุก 30 วัน
- ผู้ส่งอยู่ในผนึก
- ใครเป็นผู้ส่งถูกผนึกไว้ข้างในพร้อมลายเซ็น และโทรศัพท์ที่รับเป็นผู้ตรวจลายเซ็นนั้น
- คำเชิญที่ไม่อยู่ในบันทึก
- สมาชิกได้รับคำเชิญที่เซิร์ฟเวอร์ออกให้โดยไม่ได้มองเห็น เมื่อมีคนเข้ามา เซิร์ฟเวอร์ตรวจแค่ว่าคำเชิญนั้นเป็นของจริง บันทึกที่เซิร์ฟเวอร์เก็บไว้ไม่มีว่าใครพาใครเข้ามา แต่บันทึกการเชื่อมต่อและคำขอในขณะนั้นอาจบอกได้
ความลับระหว่างสองคนผนึกด้วย X25519 กับ ML-KEM-768 พร้อมกัน กุญแจตู้จดหมายสร้างด้วย HKDF-SHA256 และผู้ส่งลงลายเซ็นด้วย Ed25519
03 กุญแจ
กุญแจอยู่
ในโทรศัพท์ของคุณ
กุญแจส่วนตัวอยู่ในแกนความปลอดภัยบนโทรศัพท์ของคุณ ซึ่งเป็นแกนที่แอป iPhone และ Android ใช้ร่วมกัน แม้แต่โค้ดแอปที่วาดหน้าจอก็ไม่ได้รับกุญแจ
- หมายเลขอ้างอิง (handle)
- โพสต์และรูปที่ปลดล็อกแล้ว
กุญแจส่วนตัวไม่ข้ามออกไป
- กุญแจส่วนตัวสี่ดอก
- กุญแจเนื้อหา
- กุญแจส่วนตัวที่ล็อกไว้
- เฉพาะเครื่องนี้
- กุญแจสาธารณะ
- ข้อมูลสำรองสำหรับกู้คืนที่ล็อกไว้
- ครึ่งหนึ่งสำหรับกู้คืน · แฮชสำหรับค้นหา
- เฉพาะเครื่องนี้
- เก็บไว้ใน Keychain ของ iPhone หรือ Keystore ของ Android และไม่ถูกย้ายไปเครื่องอื่นผ่านการสำรองข้อมูล โทรศัพท์เครื่องใหม่จะได้กุญแจคืนผ่านการกู้คืนเท่านั้น
- โค้ดแอปเห็นแค่หมายเลขอ้างอิง
- แกนให้หมายเลขอ้างอิงกับแอปแทนกุญแจ หมายเลขอ้างอิงอย่างเดียวเปิดอะไรนอกแอปไม่ได้เลย
- ไม่ใช้เบอร์โทรศัพท์และอีเมล
- การสมัครและการเข้าใช้ใช้แค่กุญแจในโทรศัพท์ของคุณ เราไม่เก็บเบอร์โทรศัพท์และอีเมล
- มาตรฐานการเข้ารหัสที่ใช้กันแพร่หลาย
- เราไม่ใช้การเข้ารหัสที่คิดขึ้นเอง แต่ใช้มาตรฐานที่ใช้กันแพร่หลาย ผ่านไลบรารี Rust อย่าง dalek และ RustCrypto
- X25519
- ML-KEM-768
- Ed25519
- XChaCha20-Poly1305
- HKDF-SHA256
- BIP39
04 กู้คืน
โทรศัพท์หาย
แต่บัญชียังอยู่
ตั้ง PIN และจดคำภาษาอังกฤษ 18 คำลงกระดาษ รับคำได้ตอนสมัคร หรือสร้างภายหลังในการตั้งค่า บนโทรศัพท์เครื่องใหม่ เมื่อคำและ PIN ตรงกัน บัญชีจะกลับมา
- คำที่อยู่บนกระดาษเท่านั้น
- เราแสดงคำ 18 คำเพียงครั้งเดียวตอนสร้าง แล้วถามคำที่คุณจดไว้เพื่อตรวจ สร้างได้ตอนสมัครหรือภายหลังในการตั้งค่า คำเหล่านั้นไม่ถูกเก็บไว้บนเซิร์ฟเวอร์ บนคลาวด์ หรือในโทรศัพท์ และเราจะไม่แสดงอีก
- ต้องมีทั้งคำและ PIN
- คำอย่างเดียวหรือ PIN อย่างเดียวเปิดไม่ได้ PIN จะถูกล็อกเมื่อใส่ผิดหลายครั้ง และเซิร์ฟเวอร์ค้นหาบัญชีจากแฮชของค่าทางเดียวที่สร้างจากคำ ไม่ใช่จากตัวคำ
- มีเวลาให้หยุด
- การกู้คืนจะเสร็จหลังจากรอ 48 ชั่วโมง ระหว่างนั้นโทรศัพท์เครื่องเก่าจะเห็นคำขอและยกเลิกได้
- สิ่งที่เซิร์ฟเวอร์มีอย่างเดียวเปิดไม่ได้
- ความลับที่เปิดข้อมูลสำรองแบ่งเป็นสองส่วน ส่วนหนึ่งอยู่บนเซิร์ฟเวอร์ อีกส่วนอยู่ในคำที่คุณจดบนกระดาษ ต่อให้เอาเซิร์ฟเวอร์ไปทั้งหมด ถ้าไม่มีคำก็เปิดไม่ได้
คำเหล่านั้นคือคำมาตรฐาน BIP39 จำนวน 18 คำ เท่ากับ 192 บิต แม้ใช้คอมพิวเตอร์ควอนตัมไล่เดาก็ต้องลองถึง 2⁹⁶ ครั้ง สองส่วนนั้นรวมกันด้วย HKDF เพื่อเปิดข้อมูลสำรอง
05 การโทร
การโทรที่อยู่แค่
ระหว่างสองคน
คุยกับ Fam ด้วยเสียง เสียงถูกเข้ารหัสระหว่างโทรศัพท์สองเครื่อง และประวัติการโทรอยู่แค่ในโทรศัพท์ของแต่ละคน
- โทรได้เฉพาะระหว่าง Fam
- สายเรียกเข้าถูกผนึกและส่งผ่านตู้จดหมายที่ใช้กันแค่สองคน เซิร์ฟเวอร์ไม่บันทึกว่าใครโทรหาใคร
- เฉพาะเครื่องที่รับสายรู้ว่าใครโทรมา
- เครื่องที่รับสายเปิดผนึกเองว่าใครโทรมา แล้วแสดงบนหน้าจอสายเรียกเข้า เซิร์ฟเวอร์ไม่รู้ชื่อของคนที่โทร
- รีเลย์ช่วยซ่อน IP ของคุณ
- โดยปกติการโทรจะเชื่อมต่อผ่านเซิร์ฟเวอร์รีเลย์ รีเลย์เห็น IP ของโทรศัพท์ทั้งสองเครื่อง แต่เปิดเสียงที่เข้ารหัสไว้ไม่ได้ และอีกฝ่ายจะไม่เห็น IP ของคุณ ถ้าโทรศัพท์ไม่ได้รับข้อมูลรีเลย์ โทรศัพท์ทั้งสองจะเชื่อมต่อกันโดยตรง และตอนนั้นแต่ละฝ่ายอาจเห็น IP ของอีกฝ่าย
- การเชื่อมต่อที่โทรศัพท์ทั้งสองเครื่องลงลายเซ็น
- โทรศัพท์แต่ละเครื่องลงลายเซ็นข้อมูลการเชื่อมต่อด้วยกุญแจของตัวเอง ถ้ามีอะไรถูกสับเปลี่ยนระหว่างทาง สายจะไม่ต่อ
ข้อมูลการเชื่อมต่อลงลายเซ็นด้วยกุญแจบัญชี Ed25519 ของแต่ละคน
06 สิ่งที่คุณกำหนดเอง
คุณเป็นผู้กำหนด
ว่าจะให้เห็นอะไร
ล็อกแอป เลือกคนที่จะเห็นนามบัตร และให้สิ่งที่อยู่บนหน้าจออยู่แค่บนหน้าจอ
- ล็อกแอป
- ล็อก Krypton ด้วยการสแกนใบหน้า ลายนิ้วมือ หรือรหัสผ่านของโทรศัพท์ ล็อกทันที หรือหลังออกจากแอป 1 นาที 15 นาที หรือ 1 ชั่วโมง เมื่อเปิดไว้ หน้าสลับแอปจะไม่แสดงเนื้อหา การตั้งค่าอยู่แค่ในโทรศัพท์เครื่องนี้ และเซิร์ฟเวอร์ไม่รู้ว่าคุณใช้ล็อกหรือไม่
- คนที่เห็นนามบัตร
- นามบัตรของคุณถูกผนึกไว้ เลือกได้ระหว่าง “เฉพาะ Fam” กับ “ทุกคน” และไม่ว่าแบบไหน รูปต้นฉบับจะไปถึงเฉพาะ Fam ของคุณ เมื่อจำกัดขอบเขตให้แคบลง โทรศัพท์จะผนึกนามบัตรใหม่ด้วยกุญแจใหม่
- ป้องกันการแคปหน้าจอ
- หน้าจอที่คุณดูใน Krypton แคปหรืออัดหน้าจอไม่ได้
- โพสต์ที่หายไปเอง
- เมื่อตั้งให้โพสต์หายไป 24 ชั่วโมงหลังจากโพสต์ปรากฏ โพสต์ แชท และรูปจะหายไปพร้อมกัน
07 ทนทานต่อควอนตัม
แม้คอมพิวเตอร์ควอนตัม
ก็เจาะได้ยาก
มีการโจมตีที่เก็บข้อความเข้ารหัสไว้ตอนนี้ แล้วรอเปิดด้วยคอมพิวเตอร์ควอนตัมในวันหน้า ในชั้นนอกที่ส่งกุญแจให้คนที่คุณเลือก Krypton ใช้การเข้ารหัสที่พิสูจน์แล้วในปัจจุบัน (X25519) และการเข้ารหัสที่ทนทานต่อควอนตัม (ML-KEM-768) พร้อมกัน
- ต้องเจาะได้ทั้งสองแบบจึงจะเปิดได้
- ความลับจากการเข้ารหัสทั้งสองแบบถูกรวมเป็นหนึ่งก่อนผนึก ถ้าแบบหนึ่งพบจุดอ่อน อีกแบบก็ยังปกป้องไว้ นี่คือแนวทางแบบไฮบริดเดียวกับที่ Signal และ iMessage เลือกใช้
- ชั้นนอกทั้งหมดใช้ทั้งสองแบบ
- คำขอเป็น Fam และข้อความที่แต่ละคู่ใช้แบ่งความลับร่วมกัน ข้อมูลสำรองที่ผนึกไว้ การกู้คืน ชุดคำเชิญ และการรายงาน ชั้นนอกทุกชั้นที่ส่งกุญแจล้วนผนึกด้วยการเข้ารหัสทั้งสองแบบ ส่วนโพสต์และแชทในตู้จดหมายของแต่ละคู่จะห่อด้วยความลับ 256 บิตของคู่นั้นที่แบ่งกันด้วยวิธีนี้
- กุญแจสาธารณะที่สับเปลี่ยนไม่ได้
- กุญแจสาธารณะที่ทนทานต่อควอนตัมก็ผูกไว้กับลายเซ็นของบัญชีเช่นกัน ถ้าเซิร์ฟเวอร์หรือใครที่อยู่ระหว่างทางเปลี่ยนเป็นกุญแจอื่น ลายเซ็นจะไม่ตรงและโทรศัพท์จะไม่รับ
- การล็อกเนื้อหายังแข็งแรงเหมือนเดิม
- XChaCha20-Poly1305 แบบ 256 บิตที่ล็อกโพสต์และรูป รวมถึง SHA-256 ยังแข็งแรงพอแม้เจอคอมพิวเตอร์ควอนตัม จึงไม่ต้องเปลี่ยน
ชั้นนอกผนึกด้วย X25519 กับ ML-KEM-768 (มาตรฐาน NIST ของสหรัฐฯ FIPS 203) พร้อมกัน และความลับทั้งสองรวมเป็นหนึ่งด้วย SHA3-256
สิ่งที่ยังอยู่ระหว่างย้าย
- ลายเซ็น (Ed25519) ยังไม่ทนทานต่อควอนตัม แต่ลายเซ็นปลอมก็เปิดเนื้อหาในอดีตไม่ได้ ทุกบัญชีมีกุญแจลายเซ็น ML-DSA (FIPS 204) แล้ว สร้างตั้งแต่ตอนสมัครและผูกไว้กับตัวตนของคุณ และเราวางแผนจะเปิดใช้ลายเซ็นที่ใช้กุญแจนี้คู่กับ Ed25519 ก่อนที่คอมพิวเตอร์ควอนตัมที่ใช้งานได้จริงจะดูใกล้เข้ามา
- คำเชิญแบบไม่ระบุตัวตนยังคงซ่อนว่าเป็นคำเชิญของใคร แม้เจอคอมพิวเตอร์ควอนตัม ส่วนที่ป้องกันการปลอมคำเชิญจะย้ายไปพร้อมกับลายเซ็น
- เสียงในการโทรถูกล็อกระหว่างโทรศัพท์สองเครื่องด้วยการเข้ารหัสมาตรฐาน WebRTC ซึ่งส่วนนี้ยังไม่ทนทานต่อควอนตัม
สิ่งที่ไม่มีแอปไหนปกป้องได้
- รูปที่ผู้รับบันทึกลงคลังรูปภาพของตัวเอง หรือหน้าจอที่ถูกถ่ายด้วยกล้องอีกตัว
- คนที่รับโทรศัพท์ของคุณไปขณะที่ปลดล็อกอยู่
- คนที่ใช้แอปดัดแปลงดึงสิ่งที่ตัวเองได้รับออกไป
- การอัดเสียงที่คู่สนทนาทำเอง
- โทรศัพท์ที่ถูกมัลแวร์ยึดไปแล้ว
- คนที่เฝ้าดูเครือข่ายแล้วใช้ IP และเวลาโยงตู้จดหมาย การโทร หรือการสมัครเข้ากับบัญชี Krypton ไม่ได้ส่งคำขอผ่านรีเลย์ที่ซ่อน IP
- แอปที่ถูกดัดแปลงซึ่งเพิกเฉยต่อกฎที่ดูแลบนโทรศัพท์ กฎอย่างการบล็อกหรือขีดจำกัดการส่งต่อโพสต์ ดูแลโดยแอปของผู้รับ ไม่ใช่เซิร์ฟเวอร์
- ความลับระหว่างคุณกับ Fam คนหนึ่งรั่วไหล ความลับนี้ไม่เปลี่ยนไปตามเวลา ข้อความที่ผนึกไว้ของคู่นั้นซึ่งยังอยู่บนเซิร์ฟเวอร์ (สูงสุด 90 วัน) จึงอาจถูกเปิดได้
คำอธิบายทางเทคนิคฉบับเต็มจะเผยแพร่บน GitHub