จัดการไฟล์ที่เข้ารหัสฝั่งไคลเอ็นต์ด้วย Drive API

การเข้ารหัสฝั่งไคลเอ็นต์ (CSE) ช่วยให้มั่นใจได้ว่าข้อมูลของคุณจะได้รับการเข้ารหัสก่อนที่จะไปถึงเซิร์ฟเวอร์ของไดรฟ์ ซึ่งจะช่วยให้คุณควบคุมข้อมูลได้ คู่มือนี้จะแนะนำขั้นตอนการเข้ารหัสและอัปโหลดไฟล์ CSE รวมถึงการดาวน์โหลดและถอดรหัสไฟล์ CSE โดยใช้ Drive API ผ่านโปรแกรม นอกจากนี้ยังครอบคลุมแนวทางที่แนะนำสำหรับการทดสอบและตรวจสอบการใช้งาน

ก่อนเริ่มต้น

ก่อนจัดการไฟล์ที่เข้ารหัส ให้ตั้งค่าโดเมน Google Workspace โดยใช้รายการตรวจสอบต่อไปนี้

การตรวจสอบสิทธิ์และการให้สิทธิ์

หากต้องการโต้ตอบกับ 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 ซึ่งจำเป็นสำหรับขั้นตอนการรวมคีย์

เข้ารหัสข้อมูลในเครื่อง

  1. ใช้ Google Tink เพื่อสร้างคีย์การเข้ารหัสข้อมูล (DEK) ที่ไม่ซ้ำกัน สำหรับไฟล์
  2. เข้ารหัสเนื้อหาไฟล์ตามโครงสร้างไฟล์ที่เข้ารหัส

คำนวณแฮชคีย์ทรัพยากร

วิธีคำนวณแฮชคีย์ทรัพยากร

  1. แยก resource_name และ perimeter_id ออกจากโทเค็นการให้สิทธิ์ jwt ที่ได้รับจาก generateCseToken หากไม่มี perimeter_id ให้ใช้สตริงว่าง
  2. คำนวณ HMAC-SHA256 โดยใช้ DEK ข้อความธรรมดาเป็นคีย์ และสตริง ResourceKeyDigest:my_resource_name:my_perimeter_id เป็นข้อมูลที่จะลงชื่อ
  3. เข้ารหัสแฮชผลลัพธ์แบบ Base64

ดูรายละเอียดเพิ่มเติมได้ที่แฮชคีย์ทรัพยากร

รวมคีย์การเข้ารหัส

หากต้องการปกป้อง DEK ให้เข้ารหัส (รวม) โดยใช้ KACLS ภายนอก

  1. เรียกใช้ปลายทางที่เหมาะสม ดังนี้
  2. ส่ง DEK ข้อความธรรมดา โทเค็นการตรวจสอบสิทธิ์ IdP, โทเค็นการให้สิทธิ์ของ Google (หากจำเป็น), resource_name จาก JWT และ reason
  3. รับ DEK ที่รวม (WDEK) จาก KACLS

อัปโหลดไปยังไดรฟ์

ใช้ปลายทาง files.createของ Drive API เพื่อดำเนินการ อัปโหลดไฟล์แบบมาตรฐานของ Blob ของไฟล์ที่เข้ารหัส ตั้งค่าฟิลด์ต่อไปนี้ในข้อมูลเมตาของไฟล์

  • id: รหัสไฟล์ที่ไม่ซ้ำกันที่ได้รับจากการตอบกลับ generateCseToken
  • mimeType: application/vnd.google-gsuite.encrypted; content="application/octet-stream".
    • คุณตั้งค่าพารามิเตอร์ content เป็นประเภท MIME ของไฟล์ต้นฉบับได้
  • clientEncryptionDetails:
    • encryptionState: "encrypted".
    • decryptionMetadata:
      • wrappedKey: DEK ที่รวม (WDEK) ที่ได้รับจาก KACLS
      • kaclsId: รหัส KACLS ที่ได้รับจากการตอบกลับ generateCseToken
      • keyFormat: "tinkAesGcmKey".
      • aes256GcmChunkSize: "default".
      • encryptionResourceKeyHash: แฮชที่คำนวณใน คำนวณแฮชคีย์ทรัพยากร

ตัวอย่างแบบโอเพนซอร์ส

ดูการสาธิตการเข้ารหัสและอัปโหลดในทางปฏิบัติได้ที่ การสาธิตแบบโอเพนซอร์ส ซึ่งมีโซลูชันที่ใช้งานได้และใช้เป็นข้อมูลอ้างอิงที่มีประโยชน์ได้

ดาวน์โหลดและถอดรหัสไฟล์

การดาวน์โหลดไฟล์ CSE ต้องดึงเนื้อหาและข้อมูลเมตาที่เข้ารหัสจาก Google ไดรฟ์ ขอ DEK ข้อความธรรมดาจาก KACLS และถอดรหัสไฟล์ในเครื่อง

ดึงข้อมูลเมตาและเนื้อหาที่เข้ารหัสของไฟล์

เรียกใช้เมธอด Drive API Files:get เพื่อดึงข้อมูลเมตาและเนื้อหาของ ไฟล์ clientEncryptionDetails มี DecryptionMetadata ซึ่งรวมถึง DEK ที่รวม (WDEK) และ JWT ที่มีข้อมูล KACLS

แยกคีย์การเข้ารหัส

  1. เรียกใช้ปลายทางที่เหมาะสม ดังนี้
  2. ส่ง WDEK, โทเค็นการตรวจสอบสิทธิ์ IdP, โทเค็นการให้สิทธิ์ของ Google (หากจำเป็น), resource_name และ reason
  3. รับ DEK ข้อความธรรมดาจาก KACLS

ถอดรหัสข้อมูลในเครื่อง

  1. เริ่มต้น Cipher โดยใช้ DEK ข้อความธรรมดาที่ได้รับจาก KACLS
  2. ข้ามไบต์ Magic เริ่มต้นและถอดรหัสเนื้อหาที่เหลือตาม โครงสร้างไฟล์ที่เข้ารหัส

ตัวอย่างแบบโอเพนซอร์ส

ดูการสาธิตการดาวน์โหลดและถอดรหัสในทางปฏิบัติได้ที่ การสาธิตแบบโอเพนซอร์ส ซึ่งมีโซลูชันที่ใช้งานได้และใช้เป็นข้อมูลอ้างอิงที่มีประโยชน์ได้

ตรวจสอบไฟล์ที่นำเข้า

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

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

ทำการทดสอบการเข้ารหัสและการถอดรหัสแบบไปกลับ

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

การตรวจสอบแบบสุ่มด้วย Google ไดรฟ์

ตรวจสอบว่าไฟล์ที่อัปโหลดมีไอคอนล็อกในเว็บไคลเอ็นต์ของไดรฟ์ ดาวน์โหลดไฟล์ที่อัปโหลดจำนวนเล็กน้อยด้วยตนเองเพื่อตรวจสอบว่าไฟล์ทำงานตามที่คาดไว้ การตรวจสอบนี้ใช้การใช้งาน CSE ของ Google เพื่อพยายามถอดรหัส ซึ่งจะช่วยแยกปัญหาในตรรกะการเข้ารหัสหรือการรวมคีย์ รวมไฟล์จากทั้งไดรฟ์ของฉัน และไดรฟ์ที่แชร์

การสาธิตแบบโอเพนซอร์ส

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