การออกแบบด้านความปลอดภัย

ล็อกบนโทรศัพท์
และเปิดบนโทรศัพท์

โพสต์ รูป และแชทถูกผนึกก่อนออกจากโทรศัพท์ และเปิดได้เฉพาะคนที่คุณเลือก การที่คุณรู้จักกับใครอยู่ในโทรศัพท์ของแต่ละคน และเซิร์ฟเวอร์ไม่เก็บไว้

01 ผนึก

เปิดได้เฉพาะ
คนที่คุณเลือก

เมื่อคุณโพสต์ โทรศัพท์จะผนึกก่อนแล้วจึงส่ง เซิร์ฟเวอร์ทำแค่เก็บและส่งต่อโพสต์ที่ผนึกไว้ โดยไม่มีกุญแจที่จะเปิด คำตอบ รูป วิดีโอ และตัวอย่างลิงก์ก็เดินทางแบบเดียวกัน

เส้นทางของโพสต์หนึ่งที่ถูกผนึก: โทรศัพท์ของผู้เขียน เซิร์ฟเวอร์ Krypton Ø โทรศัพท์ของผู้รับ
  1. โทรศัพท์ของผู้เขียนสร้างกุญแจเนื้อหาใหม่สำหรับโพสต์นี้โดยเฉพาะ ภายในแกนความปลอดภัย

  2. แล้วใช้กุญแจนั้นล็อกข้อความ รูป และวิดีโอ ข้อความจะถูกเติมให้ได้ขนาดที่กำหนดก่อนล็อก เพื่อไม่ให้ความยาวจริงปรากฏ

  3. จากนั้นผนึกกุญแจเนื้อหาด้วยกุญแจเข้ารหัสของผู้รับแต่ละคน ได้เป็นซองหนึ่งซองต่อหนึ่งคน ผู้เขียนเองก็มีซองหนึ่งซองด้วย

เซิร์ฟเวอร์รับข้อความเข้ารหัสและซองมาเก็บไว้ แล้วส่งต่อให้ผู้รับ กุญแจที่เปิดซองมีอยู่แค่ในโทรศัพท์ของผู้รับ เซิร์ฟเวอร์จึงเปิดไม่ได้

  1. โทรศัพท์ของผู้รับเปิดซองของตัวเองภายในแกนความปลอดภัย แล้วนำกุญแจเนื้อหาออกมา

  2. แล้วใช้กุญแจนั้นปลดล็อกโพสต์และแสดงบนหน้าจอ

บนเซิร์ฟเวอร์มีแต่ข้อความเข้ารหัส
โพสต์ คำตอบ รูป วิดีโอ และตัวอย่างลิงก์ถูกล็อกไว้แล้วก่อนถึงเซิร์ฟเวอร์
ผู้อ่านแต่ละคนมีซองของตัวเอง
กุญแจของโพสต์ถูกใส่ลงซองแยกกันสำหรับผู้อ่านแต่ละคน และซองนั้นเปิดได้เฉพาะโทรศัพท์ของคนนั้น
กุญแจใหม่ทุกโพสต์
ทุกโพสต์และทุกคำตอบมีกุญแจใหม่ของตัวเอง กุญแจของโพสต์หนึ่งเปิดโพสต์อื่นไม่ได้
โทรศัพท์ของคุณเป็นผู้กำหนดผู้รับ
โทรศัพท์ของคุณผนึกโพสต์ให้รายชื่อ 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 ใช้ร่วมกัน แม้แต่โค้ดแอปที่วาดหน้าจอก็ไม่ได้รับกุญแจ

ตำแหน่งของกุญแจในโทรศัพท์ของคุณ
โทรศัพท์ของคุณ
แอป Krypton Ø
โค้ดหน้าจอJavaScript
  • หมายเลขอ้างอิง (handle)
  • โพสต์และรูปที่ปลดล็อกแล้ว

กุญแจส่วนตัวไม่ข้ามออกไป

แกนความปลอดภัยRust
  • กุญแจส่วนตัวสี่ดอก
  • กุญแจเนื้อหา
Keychain · Keystore
  • กุญแจส่วนตัวที่ล็อกไว้
  • เฉพาะเครื่องนี้
เซิร์ฟเวอร์ Krypton Ø
  • กุญแจสาธารณะ
  • ข้อมูลสำรองสำหรับกู้คืนที่ล็อกไว้
  • ครึ่งหนึ่งสำหรับกู้คืน · แฮชสำหรับค้นหา
เฉพาะเครื่องนี้
เก็บไว้ใน 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 ซึ่งส่วนนี้ยังไม่ทนทานต่อควอนตัม

08 บอท

กุญแจของบอท
ไม่เคยมาถึงเซิร์ฟเวอร์ของเรา

สมาชิก KryptonØ+ สร้างบอทที่ทำได้แค่ส่งได้ โดยบอทจะส่งข้อความและรูปเข้าแชทกลุ่มที่เจ้าของอยู่ กุญแจของบอทสร้างบนโทรศัพท์ของเจ้าของและส่งออกเป็นไฟล์ แล้วเจ้าของรันบอทบนเซิร์ฟเวอร์ของตัวเอง เราไม่ได้ทำทางให้เซิร์ฟเวอร์ของเรารันบอทแทนคุณ เพราะถ้าทำแบบนั้น เซิร์ฟเวอร์จะอ่านแชทที่มีบอทอยู่ได้

กุญแจสร้างบนโทรศัพท์ของเจ้าของ
แกนความปลอดภัยเขียนกุญแจของบอทลงไฟล์กุญแจโดยตรง เมื่อเจ้าของส่งออกไฟล์แล้ว สำเนาบนโทรศัพท์จะถูกลบ เซิร์ฟเวอร์ของเรามีแค่กุญแจสาธารณะของบอท และในไฟล์ไม่มีกุญแจของเจ้าของเอง
เซิร์ฟเวอร์ไม่รู้ว่าเป็นบอทของใคร
บอทสร้างได้โดยไม่ต้องล็อกอิน ด้วยตั๋ว KryptonØ+ แบบไม่ระบุตัวตน และกุญแจที่ใช้จัดการบอทก็ไม่ได้โยงกับกุญแจบัญชีของเจ้าของ เซิร์ฟเวอร์รู้ว่ามีบอทกี่ตัว กุญแจสาธารณะของบอท เวลาที่สร้างแต่ละตัว และบอทแต่ละตัวส่งข้อความวันละกี่ข้อความ แอปจะรับตั๋วไว้ล่วงหน้าเพื่อไม่ให้เซิร์ฟเวอร์จับคู่ตั๋วกับบอทใหม่ด้วยเวลาได้ แต่ครั้งแรกก็ยังอาจจับคู่ได้
อยู่เฉพาะแชทที่มีเจ้าของ และมีป้ายบอก
บอทเข้าได้เฉพาะแชทกลุ่มที่เจ้าของอยู่ หลังจากเจ้าของยืนยันหนึ่งครั้ง และโทรศัพท์จะทิ้งบอทที่คนอื่นเพิ่มเข้ามา ทุกที่ที่ชื่อบอทปรากฏจะมีป้าย “บอท” และโทรหาบอทหรือส่งคำขอเป็น Fam ให้บอทไม่ได้ เมื่อเจ้าของออกจากแชท บอทก็ออกไปด้วย เพื่อนับขีดจำกัดรายวัน ข้อความของบอทจะแนบเซสชันของบอทเองไปด้วย เซิร์ฟเวอร์ของเราจึงเห็นว่าบอทส่งข้อความเข้าป้ายแชทไหน (ซึ่งเป็นหมายเลขสุ่ม) แต่ไม่รู้ว่าเป็นบอทของใครหรือบอทพูดอะไร
เจ้าของอ่านแชทเหล่านั้นได้
คนที่รันบอทถือความลับของทุกแชทที่บอทอยู่ ในตำแหน่งเดียวกับคนที่อยู่ในแชทนั้น โปรแกรมรันบอทของเราไม่ดึงข้อความมา แต่โปรแกรมที่ถูกดัดแปลงอ่านได้ บอทจึงเข้าได้เฉพาะแชทที่เจ้าของอยู่ และมีป้ายให้ทุกคนรู้ว่ามีบอทอยู่

บอทมีกุญแจแบบเดียวกับสมาชิก คือ Ed25519 กับ ML-DSA-65 สำหรับตัวตน และ X25519 กับ ML-KEM-768 สำหรับการผนึก บอทแต่ละตัวมีใบรับรองที่เจ้าของเซ็นด้วยกุญแจบัญชี Ed25519 และบนเซิร์ฟเวอร์ของเรา ข้อความของบอทดูเหมือนข้อความอื่นทุกอย่าง

สิ่งที่ไม่มีแอปไหนปกป้องได้

  • รูปที่ผู้รับบันทึกลงคลังรูปภาพของตัวเอง หรือหน้าจอที่ถูกถ่ายด้วยกล้องอีกตัว
  • คนที่รับโทรศัพท์ของคุณไปขณะที่ปลดล็อกอยู่
  • คนที่ใช้แอปดัดแปลงดึงสิ่งที่ตัวเองได้รับออกไป
  • การอัดเสียงที่คู่สนทนาทำเอง
  • โทรศัพท์ที่ถูกมัลแวร์ยึดไปแล้ว
  • คนที่เฝ้าดูเครือข่ายแล้วใช้ IP และเวลาโยงตู้จดหมาย การโทร หรือการสมัครเข้ากับบัญชี Krypton Ø ไม่ได้ส่งคำขอผ่านรีเลย์ที่ซ่อน IP
  • แอปที่ถูกดัดแปลงซึ่งเพิกเฉยต่อกฎที่ดูแลบนโทรศัพท์ กฎอย่างการบล็อกหรือขีดจำกัดการส่งต่อโพสต์ ดูแลโดยแอปของผู้รับ ไม่ใช่เซิร์ฟเวอร์
  • ความลับระหว่างคุณกับ Fam คนหนึ่งรั่วไหล ความลับนี้ไม่เปลี่ยนไปตามเวลา ข้อความที่ผนึกไว้ของคู่นั้นซึ่งยังอยู่บนเซิร์ฟเวอร์ (สูงสุด 90 วัน) จึงอาจถูกเปิดได้

คำอธิบายทางเทคนิคฉบับเต็มจะเผยแพร่บน GitHub