การเข้ารหัสฝั่งไคลเอ็นต์ (CSE) ช่วยให้มั่นใจได้ว่าข้อมูลของคุณจะได้รับการเข้ารหัสก่อนที่จะไปถึงเซิร์ฟเวอร์ของไดรฟ์ ซึ่งจะช่วยให้คุณควบคุมข้อมูลได้ คู่มือนี้จะแนะนำขั้นตอนการเข้ารหัสและอัปโหลดไฟล์ CSE รวมถึงการดาวน์โหลดและถอดรหัสไฟล์ CSE โดยใช้ Drive API ผ่านโปรแกรม นอกจากนี้ยังครอบคลุมแนวทางที่แนะนำสำหรับการทดสอบและตรวจสอบการใช้งาน
ก่อนเริ่มต้น
ก่อนจัดการไฟล์ที่เข้ารหัส ให้ตั้งค่าโดเมน Google Workspace โดยใช้รายการตรวจสอบต่อไปนี้
กำหนดค่าการเข้ารหัสฝั่งไคลเอ็นต์ (CSE) สำหรับโดเมน
ตรวจสอบว่าบริการรายการควบคุมการเข้าถึงคีย์ (KACLS)รองรับปลายทาง
/wrap,/unwrap,/privilegedwrap,/privilegedunwrapและ/digestสร้างโปรเจ็กต์ใน Google Cloud คอนโซล และเปิดใช้ Drive API
การตรวจสอบสิทธิ์และการให้สิทธิ์
หากต้องการโต้ตอบกับ Drive API และ KACLS คุณต้องเลือกวิธีการตรวจสอบสิทธิ์ การเลือกนี้จะส่งผลต่อวิธีที่คุณโต้ตอบกับทั้ง 2 บริการ
- บุคคล: หากต้องการตรวจสอบสิทธิ์ในฐานะบุคคล ให้ใช้
OAuth เพื่อดำเนินการในนามของผู้ใช้รายนั้น ใช้ปลายทาง
/wrapและ/unwrapมาตรฐาน และระบุโทเค็นการให้สิทธิ์ของ Google สำหรับผู้ใช้รายนั้น - ผู้ดูแลระบบ: หากต้องการปลอมตัวเป็นผู้ใช้รายอื่นในโดเมน ให้ใช้บัญชี
บริการ
ที่มีการมอบสิทธิ์ทั่วทั้งโดเมน
(DWD) ใช้ปลายทาง
/privilegedwrapและ/privilegedunwrapโดยไม่ต้องใช้โทเค็นการให้สิทธิ์ของ Google
ดูรายละเอียดเพิ่มเติมเกี่ยวกับการสร้างข้อมูลเข้าสู่ระบบได้ที่คู่มือสร้างข้อมูลเข้าสู่ระบบ
การตรวจสอบสิทธิ์ IdP ของโดเมน
หากต้องการตรวจสอบสิทธิ์กับ IdP คุณต้องกำหนดค่ารหัสไคลเอ็นต์ OAuth และดาวน์โหลดไฟล์รหัสลับไคลเอ็นต์ แอปพลิเคชันต้องรับโทเค็นการตรวจสอบสิทธิ์จาก IdP เพื่อตรวจสอบสิทธิ์คำขอไปยัง KACLS โทเค็นนี้จำเป็นเพื่อให้แอปพลิเคชันเข้าถึงคีย์การเข้ารหัสข้อมูลได้
จัดการข้อมูลเข้าสู่ระบบอย่างปลอดภัย
แอปพลิเคชันจะจัดการข้อมูลเข้าสู่ระบบที่ละเอียดอ่อนสำหรับการตรวจสอบสิทธิ์กับ Drive API และ IdP ซึ่งได้แก่
- เนื้อหาลับจาก IdP เช่น ไฟล์รหัสลับไคลเอ็นต์
- ข้อมูลลับจาก Google เช่น ไฟล์คีย์ส่วนตัวของบัญชีบริการ
- ข้อมูลลับที่แอปจัดเก็บไว้ เช่น ข้อมูลเข้าสู่ระบบที่บันทึกไว้
คุณต้องตรวจสอบว่าได้จัดเก็บข้อมูลเข้าสู่ระบบทั้งหมดนี้ไว้อย่างปลอดภัย
ขีดจำกัดและโควต้า
ไฟล์ที่เข้ารหัสฝั่งไคลเอ็นต์อยู่ภายใต้ขีดจำกัดและโควต้ามาตรฐานของไดรฟ์ โปรดทราบขีดจำกัด ของไดรฟ์ที่แชร์ ขีดจำกัดทั่วไปของไฟล์และ โฟลเดอร์ รวมถึงวิธีจัดการ โควต้า นอกจากนี้ เครื่องมือการนำเข้าต้องจัดการการจำกัดอัตราคำขอจากบริการรายการควบคุมการเข้าถึงคีย์ (KACLS) และผู้ให้บริการข้อมูลประจำตัว (IdP)
โครงสร้างไฟล์ที่เข้ารหัส
ไดรฟ์คาดหวังรูปแบบไฟล์ที่เข้ารหัสฝั่งไคลเอ็นต์ต่อไปนี้สำหรับการอัปโหลดและดาวน์โหลด
+-------------------+
| Magic header |
+-------------------+
| Encrypted Chunk 1 |
+-------------------+
| Encrypted Chunk 2 |
+-------------------+
| ... |
+-------------------+
| Encrypted Chunk N |
+-------------------+
ส่วนหัว Magic
ส่วนหัว Magic (หรือที่เรียกว่าลายเซ็นไฟล์หรือหมายเลข Magic) คือลำดับไบต์คงที่ที่วางไว้ที่จุดเริ่มต้นของไฟล์เพื่อระบุรูปแบบของไฟล์นั้นๆ โดยเฉพาะ ไฟล์ต้องเริ่มต้นด้วยไบต์ 0x99 0x5E 0xCC 0x5E
Chunk ที่เข้ารหัส
ไฟล์ต้องแบ่งออกเป็น Chunk ขนาด 2MiB ระบบจะเข้ารหัสแต่ละ Chunk โดยใช้ Primitive การเข้ารหัสที่ผ่านการตรวจสอบสิทธิ์ด้วยข้อมูลที่เชื่อมโยง (AEAD) ของไลบรารี Google Tink ที่มีคีย์ประเภท AES-GCM โดยใช้ดัชนี Chunk และแฟล็ก Chunk สุดท้ายเป็นข้อมูลที่เชื่อมโยง ดูตัวอย่างโค้ด ที่ใช้ Drive API และเป็นไปตามข้อกำหนดนี้ ได้ที่การสาธิตแบบโอเพนซอร์ส
เข้ารหัสและอัปโหลดไฟล์
หากต้องการอัปโหลดไฟล์ CSE แอปพลิเคชันต้องตรวจสอบสิทธิ์ ขอโทเค็น CSE เข้ารหัสเนื้อหาไฟล์ในเครื่อง รวมคีย์การเข้ารหัส และสุดท้ายคืออัปโหลดเนื้อหาและข้อมูลเมตาที่เข้ารหัสไปยัง Google ไดรฟ์
รับโทเค็น CSE
ขอโทเค็น CSE จาก Google ไดรฟ์โดยเรียกใช้เมธอดของ Drive API
Files:generateCseToken
ตรวจสอบว่าคุณไม่ได้ใส่พารามิเตอร์การค้นหา fileId ในคำขอ หากต้องการสร้างไฟล์ในโฟลเดอร์ที่เฉพาะเจาะจง ให้ใส่พารามิเตอร์การค้นหา parent พร้อมรหัสโฟลเดอร์ หากไม่ระบุ parent ระบบจะสร้างไฟล์ในโฟลเดอร์ไดรฟ์ของฉันระดับบนสุดของผู้ใช้ การตอบกลับจะมีรหัสไฟล์ที่ไม่ซ้ำกันสำหรับการอัปโหลดและโทเค็นการให้สิทธิ์ JWT ซึ่งจำเป็นสำหรับขั้นตอนการรวมคีย์
เข้ารหัสข้อมูลในเครื่อง
- ใช้ Google Tink เพื่อสร้างคีย์การเข้ารหัสข้อมูล (DEK) ที่ไม่ซ้ำกัน สำหรับไฟล์
- เข้ารหัสเนื้อหาไฟล์ตามโครงสร้างไฟล์ที่เข้ารหัส
คำนวณแฮชคีย์ทรัพยากร
วิธีคำนวณแฮชคีย์ทรัพยากร
- แยก
resource_nameและperimeter_idออกจากโทเค็นการให้สิทธิ์jwtที่ได้รับจากgenerateCseTokenหากไม่มีperimeter_idให้ใช้สตริงว่าง - คำนวณ HMAC-SHA256 โดยใช้ DEK ข้อความธรรมดาเป็นคีย์ และสตริง
ResourceKeyDigest:my_resource_name:my_perimeter_idเป็นข้อมูลที่จะลงชื่อ - เข้ารหัสแฮชผลลัพธ์แบบ Base64
ดูรายละเอียดเพิ่มเติมได้ที่แฮชคีย์ทรัพยากร
รวมคีย์การเข้ารหัส
หากต้องการปกป้อง DEK ให้เข้ารหัส (รวม) โดยใช้ KACLS ภายนอก
- เรียกใช้ปลายทางที่เหมาะสม ดังนี้
- บุคคล:
/wrap - ผู้ดูแลระบบ:
/privilegedwrap
- บุคคล:
- ส่ง DEK ข้อความธรรมดา โทเค็นการตรวจสอบสิทธิ์ IdP, โทเค็นการให้สิทธิ์ของ Google (หากจำเป็น),
resource_nameจาก JWT และreason - รับ DEK ที่รวม (WDEK) จาก KACLS
อัปโหลดไปยังไดรฟ์
ใช้ปลายทาง
files.createของ Drive API เพื่อดำเนินการ
อัปโหลดไฟล์แบบมาตรฐานของ Blob ของไฟล์ที่เข้ารหัส ตั้งค่าฟิลด์ต่อไปนี้ในข้อมูลเมตาของไฟล์
id: รหัสไฟล์ที่ไม่ซ้ำกันที่ได้รับจากการตอบกลับgenerateCseTokenmimeType:application/vnd.google-gsuite.encrypted; content="application/octet-stream".- คุณตั้งค่าพารามิเตอร์
contentเป็นประเภท MIME ของไฟล์ต้นฉบับได้
- คุณตั้งค่าพารามิเตอร์
clientEncryptionDetails:encryptionState:"encrypted".decryptionMetadata:wrappedKey: DEK ที่รวม (WDEK) ที่ได้รับจาก KACLSkaclsId: รหัส KACLS ที่ได้รับจากการตอบกลับgenerateCseTokenkeyFormat:"tinkAesGcmKey".aes256GcmChunkSize:"default".encryptionResourceKeyHash: แฮชที่คำนวณใน คำนวณแฮชคีย์ทรัพยากร
ตัวอย่างแบบโอเพนซอร์ส
ดูการสาธิตการเข้ารหัสและอัปโหลดในทางปฏิบัติได้ที่ การสาธิตแบบโอเพนซอร์ส ซึ่งมีโซลูชันที่ใช้งานได้และใช้เป็นข้อมูลอ้างอิงที่มีประโยชน์ได้
ดาวน์โหลดและถอดรหัสไฟล์
การดาวน์โหลดไฟล์ CSE ต้องดึงเนื้อหาและข้อมูลเมตาที่เข้ารหัสจาก Google ไดรฟ์ ขอ DEK ข้อความธรรมดาจาก KACLS และถอดรหัสไฟล์ในเครื่อง
ดึงข้อมูลเมตาและเนื้อหาที่เข้ารหัสของไฟล์
เรียกใช้เมธอด Drive API
Files:get เพื่อดึงข้อมูลเมตาและเนื้อหาของ
ไฟล์ clientEncryptionDetails มี DecryptionMetadata ซึ่งรวมถึง DEK ที่รวม (WDEK) และ JWT ที่มีข้อมูล KACLS
แยกคีย์การเข้ารหัส
- เรียกใช้ปลายทางที่เหมาะสม ดังนี้
- บุคคล:
/unwrap - ผู้ดูแลระบบ:
/privilegedunwrap
- บุคคล:
- ส่ง WDEK, โทเค็นการตรวจสอบสิทธิ์ IdP, โทเค็นการให้สิทธิ์ของ Google (หากจำเป็น),
resource_nameและreason - รับ DEK ข้อความธรรมดาจาก KACLS
ถอดรหัสข้อมูลในเครื่อง
- เริ่มต้น Cipher โดยใช้ DEK ข้อความธรรมดาที่ได้รับจาก KACLS
- ข้ามไบต์ Magic เริ่มต้นและถอดรหัสเนื้อหาที่เหลือตาม โครงสร้างไฟล์ที่เข้ารหัส
ตัวอย่างแบบโอเพนซอร์ส
ดูการสาธิตการดาวน์โหลดและถอดรหัสในทางปฏิบัติได้ที่ การสาธิตแบบโอเพนซอร์ส ซึ่งมีโซลูชันที่ใช้งานได้และใช้เป็นข้อมูลอ้างอิงที่มีประโยชน์ได้
ตรวจสอบไฟล์ที่นำเข้า
เนื่องจาก Google ไม่มีสิทธิ์เข้าถึงคีย์การเข้ารหัส Google จึงไม่สามารถถอดรหัสและตรวจสอบไฟล์ของคุณฝั่งเซิร์ฟเวอร์ได้ ข้อผิดพลาดในการใช้งานระหว่างขั้นตอนการเข้ารหัสในเครื่องหรือการรวมคีย์จะทำให้เกิดข้อผิดพลาดเมื่อถอดรหัสไฟล์ฝั่งไคลเอ็นต์ คุณจึงต้องตรวจสอบอย่างละเอียดก่อนที่จะใช้การใช้งานของคุณเอง
เนื้อหา CSE ของ Google ไดรฟ์ที่อัปโหลดต้องได้รับการเข้ารหัสอย่างถูกต้องและมีข้อมูลเมตาที่ถูกต้องจึงจะทำงานได้อย่างถูกต้อง คุณมีหน้าที่รับผิดชอบในการตรวจสอบว่าเนื้อหานั้นถูกต้องและถอดรหัสได้
ทำการทดสอบการเข้ารหัสและการถอดรหัสแบบไปกลับ
การทดสอบโฟลว์แบบครบวงจรเป็นสิ่งสำคัญในการตรวจสอบการใช้งาน ซึ่งเกี่ยวข้องกับการใช้ชุดไฟล์ทดสอบ เข้ารหัสไฟล์เหล่านั้นโดยใช้ตรรกะในเครื่อง อัปโหลดไปยังไดรฟ์โดยใช้ API แล้วจึงดาวน์โหลดและถอดรหัส หลังจากถอดรหัสแล้ว ให้เปรียบเทียบเนื้อหาที่ได้กับไฟล์ต้นฉบับเพื่อให้แน่ใจว่าเนื้อหาเหมือนกัน กระบวนการนี้ช่วยตรวจหาปัญหาในการเข้ารหัส การรวมคีย์ หรือการจัดการข้อมูลเมตา การสาธิตแบบ โอเพนซอร์ส แสดงให้เห็นวิธีที่คุณสามารถใช้กระบวนการตรวจสอบความถูกต้อง ดังกล่าวภายในแอปพลิเคชันของคุณเอง
การตรวจสอบแบบสุ่มด้วย Google ไดรฟ์
ตรวจสอบว่าไฟล์ที่อัปโหลดมีไอคอนล็อกในเว็บไคลเอ็นต์ของไดรฟ์ ดาวน์โหลดไฟล์ที่อัปโหลดจำนวนเล็กน้อยด้วยตนเองเพื่อตรวจสอบว่าไฟล์ทำงานตามที่คาดไว้ การตรวจสอบนี้ใช้การใช้งาน CSE ของ Google เพื่อพยายามถอดรหัส ซึ่งจะช่วยแยกปัญหาในตรรกะการเข้ารหัสหรือการรวมคีย์ รวมไฟล์จากทั้งไดรฟ์ของฉัน และไดรฟ์ที่แชร์
การสาธิตแบบโอเพนซอร์ส
แพ็กเกจการอัปโหลด CSE ของไดรฟ์แบบโอเพนซอร์สมีไลบรารี Python ที่ใช้งานได้และสมบูรณ์ รวมถึงตัวอย่างบรรทัดคำสั่งที่ใช้โฟลว์การอัปโหลดและดาวน์โหลด CSE ที่อธิบายไว้ในคู่มือนี้ เราขอแนะนำให้ตรวจสอบโค้ดการสาธิตก่อนที่จะสร้างการผสานรวม CSE ของคุณเอง