
การแชทบนเว็บแบบ end-to-end ด้วยการเข้ารหัสที่แข็งแกร่ง
0FC ช่วยให้คุณสามารถเรียกใช้แชทในกลุ่มเบราว์เซอร์ที่ปลอดภัยพร้อมห้องแชทแบบแยกได้มีคุณสมบัติพิเศษบางอย่าง:
- end-to-end สำหรับห้องแชทที่เฉพาะเจาะจง: เซิร์ฟเวอร์ไม่สามารถทำได้ดีไปกว่าการโจมตี DOS
- เซิร์ฟเวอร์ถือเป็นโซนที่เชื่อถือได้น้อยที่สุดการดำเนินการที่สำคัญทั้งหมดเกิดขึ้นทางฝั่งไคลเอ็นต์:
- คีย์ชั่วคราวที่ใช้ในการป้องกันการจราจรในห้องแชทถูกสร้างขึ้นภายในเบราว์เซอร์ของเจ้าของห้องและเผยแพร่ไปยังส่วนที่เหลือ
- โทเค็นลับที่ใช้ในการเข้าถึงห้องแชทถูกสร้างขึ้นทางฝั่งไคลเอ็นต์ (แม้ว่าส่วนหนึ่งของการตรวจสอบจะเกิดขึ้นทางฝั่งเซิร์ฟเวอร์)
- ในระหว่างการแชร์คีย์ข้อความบริการทุกรายการได้รับการคุ้มครองโดยคีย์ซึ่งได้มาจากข้อมูลแบบสุ่มของมากกว่าหนึ่งฝ่าย
- ข้อความขาออกจะถูกเข้ารหัสและส่งเพียงครั้งเดียว (สมาชิกห้องทั้งหมดแบ่งปันคีย์สมมาตรเดียวกัน)
- โทเค็นการเข้าถึงความลับใช้ครั้งเดียว (ลบหลังจากการยืนยันคีย์)
0FC เริ่มต้นจากการทดสอบสนามเด็กเล่นสำหรับกรณีการใช้งานที่ซับซ้อนของ Themis/Webthemis แต่ก็น่าสนใจพอที่จะปล่อยมันเป็นรหัสแยกต่างหาก
สำคัญ: เพื่อให้ได้รับการพิจารณาอย่างปลอดภัย 0FC ควรได้รับการตรวจสอบโดยบุคคลที่สามและปรับใช้อย่างเหมาะสม ไม่ควรเชื่อถือเครื่องมือเข้ารหัสโดยไม่มีการตรวจสอบบุคคลที่สาม ก่อนหน้านั้นจะเกิดขึ้น (ถ้าเป็นเช่นนั้น) มีคำอธิบายโปรโตคอลในตอนท้ายของเอกสารนี้ซึ่งช่วยให้คุณสามารถดูการทำงานภายในของ 0FC และตัดสินใจของคุณเอง เราเองก็ตระหนักถึงภัยคุกคามที่ไม่ค่อยมีความเป็นไปได้ที่ไม่เกี่ยวข้องกับการเข้ารหัส แต่เป็นวิธีการทำงานของเบราว์เซอร์ (ดูส่วนรูปแบบการคุกคามของบล็อกโพสต์)
0FC Backend เขียนขึ้นใน Python ส่วนหน้าเป็นไปตาม webthemis ดังนั้นจึงใช้งานได้ในเบราว์เซอร์ที่ใช้ Google Chrome เท่านั้น (ยัง)
0FC ได้รับใบอนุญาตผ่านใบอนุญาต Apache 2 เราจะมีความสุขถ้าคุณสร้างบางสิ่งบางอย่างตามรหัสนี้และโปรโตคอลของ 0FC หากคุณต้องการความช่วยเหลือใด ๆ ให้ติดต่อ
อ่านโพสต์บล็อกเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ 0FC และเทคโนโลยีพื้นฐาน
การติดตั้งและใช้
0FC ประกอบด้วยสององค์ประกอบ: เซิร์ฟเวอร์และไคลเอนต์
เซิร์ฟเวอร์ 0fc
0fc เซิร์ฟเวอร์ต้องการ:
- Python 3.4
- ปิ๊ก
- Themis (อาคารและการติดตั้ง)
ก่อนอื่นคุณจะต้องติดตั้งการพึ่งพา Python:
pip install -r requirements.txt
คุณสามารถเรียกใช้เซิร์ฟเวอร์:
โดยเซิร์ฟเวอร์เริ่มต้นจะฟังพอร์ต 5103 หากต้องการเปลี่ยนพอร์ตเพิ่ม -p <port> :
python3 server.py -port 333
0fc ไคลเอนต์
0FC ไคลเอ็นต์มาแล้วที่รวบรวมใน / โฟลเดอร์แบบคงที่ / โฟลเดอร์ โปรดจำไว้ว่ามันมีคีย์เซิร์ฟเวอร์ hardcoded; หากคุณสร้างคีย์ใหม่คุณจะต้องสร้างไคลเอนต์ใหม่ (ดูด้านล่าง)
ใช้ 0fc
... ค่อนข้างอธิบายตนเอง คุณสามารถสร้างห้องใหม่สร้างโทเค็นและเชิญผู้คนเข้าร่วมหรือป้อนโทเค็นที่มีอยู่เพื่อเข้าห้อง
การสร้างไคลเอนต์ 0FC ใหม่
หากคุณต้องการคอมไพล์ลูกค้า 0FC (วัตถุ PNACL) ตัวคุณเองนี่คือสิ่งที่คุณต้องทำ:
- ในการสร้างวัตถุ PNACL คุณต้องติดตั้ง NaCl SDK และสร้างตัวแปร Enviromant
PNACL_ROOT พร้อมเส้นทางไปยังไฟล์ SDK ที่ติดตั้ง - โคลน 0FC ที่เก็บด้วย submodules จาก GitHub:
git clone https://github.com/cossacklabs/0fc
cd 0fc
git submodules update --init --recursive
- สร้าง webthemis:
- สร้างโมดูล 0FC PNACL:
เสร็จแล้ว!
สถาปัตยกรรม

0FC ประกอบด้วย 2 องค์ประกอบคลาสสิก: ไคลเอนต์และเซิร์ฟเวอร์
ลูกค้าต้องรับผิดชอบ:
- แสดง UI ให้กับผู้ใช้
- ฟังก์ชั่นการจัดการเข้ารหัสและความน่าเชื่อถือทั้งหมด
- การสื่อสารกับเซิร์ฟเวอร์รีเลย์
เซิร์ฟเวอร์รับผิดชอบ:
- ให้บริการ UI + PEXE (โมดูล PNACL) ให้กับลูกค้าผ่าน HTTP GET
- เรียกใช้บริการรีเลย์ WebSocket ซึ่งได้รับข้อความและถ่ายทอดให้ทุกคน
ผ่าน WebSocket Link ลูกค้าพูดคุยกับเซิร์ฟเวอร์ผ่านวัตถุ Securesession Themis ซึ่งให้ความปลอดภัยการขนส่งระดับสูง คีย์เซิร์ฟเวอร์จะถูกบันทึกไว้ในไคลเอนต์ดังนั้นความน่าเชื่อถือจึงถูกสร้างขึ้นตามความสัมพันธ์ระหว่างคีย์เซิร์ฟเวอร์จริงและคีย์เซิร์ฟเวอร์ที่ป้อนเข้าสู่ไคลเอนต์ในไบนารี
ภายในลิงก์ Securesession นี้ข้อความที่เข้ารหัส SecureCell จะถูกส่ง
โปรโตคอลและโครงการ

การสร้างห้องพัก
- เจ้าของห้องสร้างคู่สำคัญ
[client] - เจ้าของห้องสร้างคีย์ห้อง (ซึ่งจะใช้ในการเข้ารหัสข้อความในห้อง)
[client] - เจ้าของห้องขอให้เซิร์ฟเวอร์สร้างห้องรับ ID ห้องเพื่อตอบสนอง
[client] + [server]
เชิญผู้อื่น (การแบ่งปันคีย์)
- เจ้าของห้องสร้างโทเค็นเชิญแบบสุ่ม (ครั้งเดียว)
[client] - เจ้าของห้องส่งคำเชิญโดยช่องทางนอกวง (เช่นอีเมล) ซึ่งรวมถึง Token คำเชิญคีย์สาธารณะและรหัสห้องพัก
[client] - ผู้ใช้ได้รับโทเค็นคำเชิญ
[client] - ผู้ใช้สร้างคู่คีย์
[client] - ผู้ใช้สร้างคีย์การเข้าร่วมแบบสุ่ม
[client] - ผู้ใช้ส่งข้อความที่ปลอดภัยไปยังเจ้าของห้องผ่านเซิร์ฟเวอร์ด้วยปุ่มเข้าร่วมที่เข้ารหัส
[client] - เซิร์ฟเวอร์อาจตรวจสอบ ACL ว่าคำเชิญนี้ถูกต้องและส่งผ่านข้อความไปยังเจ้าของห้อง
[server] - เจ้าของห้องคลายคีย์เข้าร่วม
[client] - เจ้าของห้องส่งคีย์ห้องที่ปิดผนึกไปยังผู้ใช้ผ่านเซิร์ฟเวอร์โดยใช้การเข้าร่วมคีย์เป็นคีย์หลักและเชิญโทเค็นเป็นบริบท
[client] - เซิร์ฟเวอร์อาจตรวจสอบ ACL ว่าการตอบกลับนี้ถูกต้องหรือไม่และส่งผ่านข้อความไปยังผู้ใช้
[server] - ผู้ใช้ปลดคีย์ห้อง
[client] - ผู้ใช้ส่งข้อความที่ปิดผนึกยืนยันไปยังเจ้าของห้อง
[client] - เจ้าของเมื่อตรวจสอบข้อความยืนยันข้อความของผู้ใช้ลงนามคีย์สาธารณะของเขาและส่งไปยังเซิร์ฟเวอร์
[client] + [server] - เซิร์ฟเวอร์ตรวจสอบลายเซ็นและพิจารณาผู้ใช้ตามที่เพิ่มลงในห้องแชท
[server] - เมื่อใช้โทเค็นเชิญแล้วจะถูกทิ้งโดยเจ้าของห้อง
[server]
การแลกเปลี่ยนข้อความ
- สมาชิกห้องแลกเปลี่ยนข้อความปิดผนึกพวกเขาด้วยคีย์ห้อง เซิร์ฟเวอร์เพียงส่งต่อข้อความที่เข้ารหัสโดยไม่สามารถเข้าถึงเนื้อหาได้
[server]
การจัดการที่สำคัญ
- แป้นพิมพ์ถูกสร้างขึ้นสำหรับทุกห้อง
[client] - Keypair ถูกเก็บไว้ในที่เก็บข้อมูลถาวรของเบราว์เซอร์
[client] - เบราว์เซอร์ที่เก็บถาวรจะถูกเข้ารหัสด้วย Secure Cell (โหมดซีล) คีย์ที่ได้มาจากรหัสผ่านของผู้ใช้อินพุตเมื่อเข้าร่วมการแชท
[client]
การสื่อสารเซิร์ฟเวอร์
- ไคลเอนต์สื่อสารกับเซิร์ฟเวอร์โดยใช้เซสชัน Secure
[server] - คีย์สาธารณะที่เชื่อถือได้ของเซิร์ฟเวอร์นั้นถูกเก็บไว้ในไคลเอนต์
[client] - เซิร์ฟเวอร์ไม่ได้ทำการตรวจสอบสิทธิ์ไคลเอนต์ให้เชื่อถือคีย์ไคลเอ็นต์ SS ทุกรายการโดยอัตโนมัติ (นี่เป็นขั้นตอนแรกที่ชัดเจนในการแข็งตัวหากความปลอดภัยมีความสำคัญมากกว่าความแพร่หลายและการไม่เปิดเผยตัวตน)
[server]
การหมุนที่สำคัญ
- ทุกข้อความที่ส่งและรับ) ทุก ๆ 100 (กำหนดค่าได้) เจ้าของห้องสร้างคีย์ใหม่เข้ารหัสด้วยคีย์เก่าและส่งข้อความพิเศษ
[client] - เซิร์ฟเวอร์บังคับใช้ข้อความดังกล่าวอาจมาจากเจ้าของห้องเท่านั้น
[server]
การแต่งกาย
- รายชื่อสมาชิกได้รับการดูแลรักษาสำหรับทุกห้องเป็นรายการกุญแจสาธารณะ (+บ่งชี้ว่าใครเป็นเจ้าของห้อง)
[server] - ห้องพักทุกห้องมีเจ้าของห้อง (แต่เดิมผู้สร้างห้อง)
[server] - เจ้าของห้องรับผิดชอบการหมุนที่สำคัญ
[client]
ประวัติการแชท
- เซิร์ฟเวอร์ช่วยให้ลูกค้าสามารถดึงประวัติแชทได้ตั้งแต่การออกเดินทางครั้งสุดท้ายสำหรับสมาชิกที่ออนไลน์และรู้คีย์ก่อนการหมุน
[server] - เซิร์ฟเวอร์ช่วยให้ลูกค้าสามารถดึงประวัติแชทได้ตั้งแต่การหมุนคีย์ล่าสุดสำหรับสมาชิกใหม่
[server]
ต้องการทราบข้อมูลเพิ่มเติมหรือไม่?
อ่านโพสต์บล็อกของเราด้วยพื้นหลังบางอย่างเกี่ยวกับการพัฒนา 0FC และข้อควรพิจารณาด้านความปลอดภัยที่หลากหลาย