ข้ามไปยังเนื้อหา

การแก้ไขปัญหา: การเข้ารหัสลับและแฟล็กสิทธิ์

ใช้รายการต่อไปนี้เพื่อแก้ไขความล้มเหลวของการถอดรหัสลับที่เอนจินแจ้งผ่าน NextPDF\Exception\EncryptionException และ NextPDF\Security\Exception\DecryptionFailedException รวมถึงทำความเข้าใจขอบเขตของแฟล็กสิทธิ์ Portable Document Format (PDF)

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

  • อาการ EncryptionException พร้อมข้อความในรูปแบบ Encryption operation "<op>" failed using algorithm "<algorithm>"
  • สาเหตุที่เป็นไปได้ การดำเนินการของไซเฟอร์ไม่สำเร็จ โดยทั่วไปเกิดจากส่วนขยาย OpenSSL ขาดหายไปหรือกำหนดค่าผิด คีย์ไม่ถูกต้อง หรือขนาดของ initialization vector (IV) ไม่ถูกต้องที่ขอบเขตของไซเฟอร์
  • หลักฐาน / การวินิจฉัย getContext() คืนค่า algorithm และ operation ค่า operation เป็นหนึ่งใน encrypt, decrypt หรือ key_derivation จึงระบุได้ว่าขั้นตอนใดล้มเหลว
  • การแก้ไข
  1. ยืนยันว่ามีการติดตั้งและโหลดส่วนขยาย OpenSSL ของ PHP แล้ว
  2. ใช้ฟิลด์ operation เพื่อค้นหาขั้นตอนที่ล้มเหลว
  3. สำหรับ key_derivation ให้ตรวจสอบรหัสผ่านหรือคีย์ที่ป้อนเข้า
  4. ลองเรียกการทำงานใหม่อีกครั้ง

รายการ: การถอดรหัสลับล้มเหลวด้วยเหตุผลเชิงโครงสร้าง

หัวข้อที่มีชื่อว่า “รายการ: การถอดรหัสลับล้มเหลวด้วยเหตุผลเชิงโครงสร้าง”
  • อาการ DecryptionFailedException พร้อมข้อความในรูปแบบ Decryption failed for "<algorithm>": <reason>
  • สาเหตุที่เป็นไปได้ ไม่สามารถประมวลผลไซเฟอร์เท็กซ์ได้ด้วยเหตุผลที่ไม่เกี่ยวกับการดัดแปลง เช่น ไซเฟอร์เท็กซ์ถูกตัดทอน IV ขาดหายไป หรือมีการป้อนคีย์ที่ไม่ถูกต้องที่ขอบเขตของ application programming interface (API) การตรวจสอบความสมบูรณ์จึงไม่ทำงาน เพราะมีข้อมูลไม่เพียงพอสำหรับการประเมิน
  • หลักฐาน / การวินิจฉัย getContext() คืนค่า algorithm และ reason เอกสารต้นทางแยกความแตกต่างระหว่าง DecryptionFailedException กับ TamperedDataException: ข้อยกเว้นนี้หมายถึงข้อผิดพลาดด้านการกำหนดค่าหรือการขนส่งข้อมูล ไม่ใช่การดัดแปลง อย่าถือว่าข้อยกเว้นนี้เป็นเหตุการณ์ด้านความปลอดภัยเพียงอย่างเดียว
  • การแก้ไข
  1. อ่าน reason เพื่อระบุข้อบกพร่องเชิงโครงสร้าง ตัวอย่างเช่น ciphertext shorter than IV+tag
  2. ตรวจสอบว่าไซเฟอร์เท็กซ์ถูกขนส่งโดยไม่มีการตัดทอน
  3. ยืนยันว่าคีย์ที่ป้อนที่ขอบเขตคือคีย์เดียวกับที่ใช้เข้ารหัสลับเอกสาร
  4. ลองเรียกการทำงานใหม่อีกครั้ง
  • อาการ ได้รับ NextPDF\Security\Exception\TamperedDataException แทนที่จะเป็น DecryptionFailedException
  • สาเหตุที่เป็นไปได้ การตรวจสอบความสมบูรณ์ทำงานแล้วและล้มเหลว กรณีนี้แตกต่างจากความล้มเหลวของการถอดรหัสลับเชิงโครงสร้าง: มีข้อมูลเพียงพอสำหรับประเมินความสมบูรณ์ และความสมบูรณ์ไม่ผ่านการตรวจสอบ
  • หลักฐาน / การวินิจฉัย ต้นทางแยกความแตกต่างของสองคลาส: DecryptionFailedException เป็นข้อผิดพลาดเชิงโครงสร้างและไม่ใช่เหตุการณ์ด้านความปลอดภัย ส่วน TamperedDataException บ่งชี้ว่าเนื้อหาที่ผ่านการรับรองความถูกต้องไม่ผ่านการตรวจสอบ
  • การแก้ไข
  1. ให้ถือว่าข้อมูลที่นำเข้าไม่น่าเชื่อถือ และอย่าใช้เนื้อหาที่ถอดรหัสลับแล้ว
  2. ดึงเอกสารใหม่จากแหล่งที่เชื่อถือได้
  3. หากความล้มเหลวยังคงเกิดขึ้นกับแหล่งที่ทราบว่าถูกต้อง ให้บันทึก getContext() ไว้สำหรับรายงานเหตุการณ์

รายการ: แฟล็กสิทธิ์ไม่ได้หยุดการดำเนินการปลายทาง

หัวข้อที่มีชื่อว่า “รายการ: แฟล็กสิทธิ์ไม่ได้หยุดการดำเนินการปลายทาง”
  • อาการ เอกสารถูกสร้างขึ้นโดยตั้งค่าแฟล็กสิทธิ์ไว้ เช่น ไม่อนุญาตให้คัดลอกหรือพิมพ์ แต่โปรแกรมอ่านยังคงคัดลอกหรือพิมพ์เนื้อหาได้
  • สาเหตุที่เป็นไปได้ นี่คือข้อจำกัดที่คาดหมายไว้ ไม่ใช่ข้อบกพร่อง ค่าจำนวนเต็มของสิทธิ์ที่ส่งไปยังตัวสร้างพจนานุกรมการเข้ารหัสลับของ Core ไม่ได้ถูกใช้เป็นการบังคับใช้โดยไลบรารีนี้ แฟล็กเป็นเมทาดาทาเชิงแนะนำ โปรแกรมอ่านที่ไม่ปฏิบัติตามแฟล็กจะไม่ถูกบล็อกโดย NextPDF
  • หลักฐาน / การวินิจฉัย src/Security/Encryption/EncryptionDictionaryBuilder.php ประกาศ buildDict(int $permissions, string $fileId) และระบุพารามิเตอร์ไว้ว่า ignored; retained for forward compatibility เมธอดเริ่มต้นด้วย unset($permissions, $fileId) แฟล็กสิทธิ์ที่แสดงผลโดย src/Inspect/PdfPermissions.php เป็นฟิลด์ตรวจสอบแบบอ่านอย่างเดียว ไม่ใช่ชั้นการบังคับใช้
  • การแก้ไข
  1. อย่าพึ่งพาแฟล็กสิทธิ์เพื่อหยุดการพิมพ์ การคัดลอก หรือการแก้ไข ไลบรารีฝั่งผู้ผลิตไม่สามารถบังคับใช้แฟล็กเหล่านี้ได้
  2. ในกรณีที่คุณต้องจำกัดการเข้าถึง ให้ควบคุมการเผยแพร่ตัวไฟล์เอง หรือใช้ระบบควบคุมการเข้าถึงภายนอก PDF
  3. ใช้ PdfPermissions เพียงเพื่อรายงานแฟล็กที่เอกสารที่มีอยู่ประกาศไว้เท่านั้น ไม่ใช่เพื่อยืนยันว่าการดำเนินการเหล่านั้นถูกป้องกัน
  • อาการ เกิด NextPDF\Security\Exception\IncompatiblePdfAModeException เมื่อบิลด์เปิดใช้งาน PDF/A และร้องขอการเข้ารหัสลับ
  • สาเหตุที่เป็นไปได้ โปรไฟล์ PDF/A ห้ามใช้คีย์ Encrypt ในเทรลเลอร์ เอนจินจึงปฏิเสธการรวมกันนี้ไม่ว่าจะเรียกใช้ในลำดับใด
  • หลักฐาน / การวินิจฉัย ดูรายการ PDF/A และ PDF/UA สำหรับข้อกำหนดที่อ้างถึง ฟิลด์ getContext() และการทดสอบเส้นทางความล้มเหลว
  • การแก้ไข
  1. ตัดสินใจว่าเอกสารต้องการความสอดคล้องสำหรับการจัดเก็บถาวรหรือการเข้ารหัสลับ
  2. นำการเรียกสำหรับคุณสมบัติที่คุณไม่ต้องการออก
  3. เรียกใช้ไปป์ไลน์ใหม่อีกครั้ง
  • DecryptionFailedException และ TamperedDataException มีความหมายต่างกัน: ความล้มเหลวเชิงโครงสร้างกับความสมบูรณ์ที่ล้มเหลว แยกการทำงานตามคลาส ไม่ใช่ตามข้อความ
  • ตัวสร้างพจนานุกรมการเข้ารหัสลับของ Core เพิกเฉยต่อค่าจำนวนเต็มของสิทธิ์ บิลด์ใดก็ตามที่พึ่งพาการบังคับใช้สิทธิ์จากแพ็กเกจ Core ตั้งอยู่บนความเข้าใจผิด
  • PdfPermissions ถูกเติมค่าเฉพาะสำหรับเอกสารที่เข้ารหัสลับในระดับความลึกของการตรวจสอบแบบเต็มเท่านั้น และสะท้อนแฟล็กที่ประกาศไว้ ฟิลด์ที่มีค่าไม่ได้หมายความว่าการดำเนินการถูกป้องกัน

อภิธานศัพท์: แฟล็กสิทธิ์ · การถอดรหัสลับแบบรับรองความถูกต้อง