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

การเข้ารหัส PDF ทำงานอย่างไรจริงๆ และมีขีดจำกัดอย่างไร

Spec: ISO 32000-2, §7.6

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

หน้านี้แยกทั้งสองสิ่งออกจากกัน อธิบายว่า AES-256 ปกป้องอะไรจริงๆ รหัสผ่านทั้งสองมีไว้เพื่ออะไรกันแน่ และขอบเขตที่ตรงไปตรงมาอยู่ตรงไหน

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

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

  • การเข้ารหัสปกป้องความลับ ด้วย AES-256 เนื้อหา string และ stream ของ PDF คือ ciphertext ของจริง หากไม่มีคีย์ มันก็อ่านไม่ออก
  • user password เปิดเอกสาร ใส่มันเข้าไปแล้วคุณจะเห็นเนื้อหา หากไม่มีมัน ก็ไม่มีอะไรให้อ่าน
  • owner password ควบคุมสิทธิ์ มันคือคีย์ “สิทธิ์เต็ม” แฟล็กสิทธิ์ที่มันคุ้มกัน ได้แก่ พิมพ์ คัดลอก แก้ไข ถูกบันทึกไว้ภายในเอกสารที่ถูกเข้ารหัส
  • แฟล็กสิทธิ์เป็นแบบ reader-cooperative มันคือคำขอต่อโปรแกรมอ่านที่ประพฤติดี ไม่ใช่การบังคับใช้ โปรแกรมอ่านที่เพิกเฉยต่อมันสามารถพิมพ์ คัดลอก หรือแก้ไขได้อยู่ดี
  • โครงสร้างยังคงมองเห็นได้ การเข้ารหัสซ่อนเนื้อหา ไม่ใช่ซ่อนโครงกระดูกของเอกสาร จำนวนหน้าและผังของอ็อบเจกต์ไม่ใช่ความลับ

การเข้ารหัส PDF ถูกนิยามโดย Spec: ISO 32000-2, §7.6 โมเดลนี้แม่นยำ คือ security handler อนุมานคีย์เข้ารหัสไฟล์จากรหัสผ่าน string และ stream ของเอกสารถูกเข้ารหัสด้วยคีย์นั้น และ encryption dictionary ที่ถูกอ้างถึงจาก trailer ของไฟล์จะบันทึกว่าใช้ cipher ใด คีย์ยาวเท่าใด และผู้สร้างประกาศสิทธิ์ใดไว้

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

รหัสผ่านทั้งสองอยู่คนละชั้น และความแตกต่างนี้คือส่วนที่ควรเข้าใจให้ถูกต้องที่สุด

  1. A password is suppliedEither the user password (open) or the owner password (full rights).
  2. The security handler derives the keyISO 32000-2 §7.6.4 turns the password into the file encryption key.
  3. Content is decryptedAES-256 turns the encrypted strings and streams back into readable bytes.
  4. Permissions are consultedThe owner key grants all rights; the user key is bound by the declared permission flags — if the reader chooses to honour them.
How a password becomes readable content: the user password (or the owner password) is run through the standard security handler's key-derivation routine to recover the file encryption key, which then decrypts the document's strings and streams. The owner password additionally unlocks the full set of permissions; the user password is bound by whatever permission flags the author declared.

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

owner password คือรหัสผ่านสำหรับสิทธิ์ ไฟล์สามารถถูกเปิดโดยใครก็ได้ (ไม่มี user password) แต่ยังประกาศ owner password ที่กั้นการกระทำแบบ “สิทธิ์เต็ม” ไว้ได้ เช่น การพิมพ์ที่ความละเอียดสูง การคัดลอกข้อความ การแก้ไขไฟล์ สิ่งสำคัญคือ บิตสิทธิ์ที่ owner password ปกป้องนั้นถูกปกป้องความถูกต้องครบถ้วนโดย standard security handler การไปยุ่งกับมันจะถูกตรวจจับและปฏิเสธโดยโปรแกรมอ่านที่ถูกต้องตามข้อกำหนด เพราะ handler ผูกสิทธิ์ที่ประกาศไว้เข้ากับคีย์เข้ารหัส บิตเหล่านี้ไม่ใช่ไบต์ที่อ่านไม่ได้หรือแก้ไม่ได้ตามตัวอักษร คือผู้โจมตีเปลี่ยนมันได้ แต่สำเนาที่ถูกเปลี่ยนแปลงจะตรวจสอบความถูกต้องไม่ผ่าน ดังนั้นโปรแกรมอ่านที่ถูกต้องตามข้อกำหนดจึงปฏิบัติต่อมันในฐานะไฟล์เสียหาย มันคือ tamper-evident มันเพียงแต่ไม่ บังคับใช้ตัวเอง

การตั้งค่าการเข้ารหัสแสดงออกมาได้ง่าย สิ่งที่สำคัญคือการอ่านผลลัพธ์อย่างตรงไปตรงมา คือสิ่งนี้กำหนดเจตนา และส่วนของสิทธิ์ในเจตนานั้นเป็นเพียงคำแนะนำ

<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Security\Encryption\EncryptionMode;
use NextPDF\Security\Encryption\Permission;
$document = Document::createStandalone();
$document->setTitle('Confidential Offer');
$document->addPage();
// Confidentiality is real: AES-256 means the content is unreadable
// without the user password. This half is cryptographically enforced.
$document->encrypt(
userPassword: 'open-sesame',
ownerPassword: 'full-rights-key',
mode: EncryptionMode::Aes256,
// Permissions are a declared request to a cooperating reader,
// recorded inside the encrypted document — not a hard lock.
permissions: Permission::Print->value | Permission::CopyContent->value,
);
$document->save('offer.pdf');

user password และ owner password เป็นคีย์คนละตัวที่มีงานต่างกัน อาร์กิวเมนต์ permissions ระบุสิ่งที่โปรแกรมอ่านที่ประพฤติดี ควร อนุญาต มันคือ metadata ที่ซื่อสัตย์ ถูกปกป้องความถูกต้องครบถ้วนโดย security handler เพื่อให้การไปยุ่งกับมันถูกตรวจจับได้ และนั่นคือเพดานของสิ่งที่ไลบรารีตัวสร้างสัญญาได้

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

NextPDF จงใจในเรื่องนี้ เส้นทางการเข้ารหัสหลักปฏิบัติต่อแฟล็กสิทธิ์ในฐานะเจตนาที่ประกาศไว้ และไม่เคยแสร้งว่าจะบังคับใช้มัน หากคุณต้องการให้การกระทำถูกป้องกันอย่างแท้จริง การควบคุมนั้นต้องอยู่ภายนอกไฟล์ คือในตัวว่าคุณมอบเอกสารให้ใคร หรือในระบบควบคุมการเข้าถึงที่ห่อหุ้มมันไว้

จงแม่นยำว่าแต่ละครึ่งรับประกันอะไร การเข้ารหัส (ชั้น user-password) คือการควบคุมความลับของจริง คือแข็งแกร่งหากรหัสผ่านแข็งแกร่ง และดีได้เพียงเท่าความลับที่คุณเลือกเท่านั้น ส่วนสิทธิ์ (ชั้น owner-password) คือ metadata แบบ tamper-evident ไม่ใช่การควบคุมการเข้าถึง

What you might expectWhat encryption actually delivers
ไม่มีใครอ่านเนื้อหาได้หากไม่มีรหัสผ่านจริง ด้วย AES-256 และ user password ที่แข็งแกร่ง string และ stream อ่านไม่ได้หากไม่มีคีย์ บังคับใช้จริง
ไม่มีใครเขียน “ห้ามคัดลอก” ใหม่ให้เป็น “อนุญาตให้คัดลอก” ได้tamper-evident ไม่ใช่เป็นไปไม่ได้ แฟล็กสิทธิ์ถูกปกป้องความถูกต้องครบถ้วนโดย standard security handler คือคนภายนอกแก้ไบต์ได้ แต่สำเนาที่ถูกเปลี่ยนแปลงจะตรวจสอบความถูกต้องไม่ผ่าน ดังนั้นโปรแกรมอ่านที่ถูกต้องตามข้อกำหนดจึงตรวจจับและปฏิเสธการเปลี่ยนแปลงนั้น
โปรแกรมอ่านจะถูกกันไม่ให้คัดลอกหรือพิมพ์ไม่มีตัวสร้าง PDF ใดรับประกันได้ โปรแกรมอ่านที่ไม่ให้ความร่วมมือสามารถเพิกเฉยต่อแฟล็กได้ นี่คือคุณสมบัติของรูปแบบไฟล์ ไม่ใช่ข้อจำกัดของ NextPDF

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

  • The standards landscape ตำแหน่งที่ ISO 32000-2 และข้อกำหนดการเข้ารหัสของมันอยู่ท่ามกลางมาตรฐาน PDF
  • Encryption and permission flags รายการเชิงปฏิบัติ ได้แก่ การถอดรหัสที่ล้มเหลว และขอบเขตของสิทธิ์ในโค้ด
  • PDF แท้จริงแล้วคืออะไร โมเดลอ็อบเจกต์ที่การเข้ารหัสปกป้อง และโครงสร้างที่มันปล่อยให้มองเห็น
  • ลายเซ็นอยู่ใน PDF อย่างไร อีกครึ่งหนึ่งของความน่าเชื่อถือของเอกสาร คือการเข้ารหัสซ่อน ลายเซ็นพิสูจน์
  • AES-256 มาตรฐานการเข้ารหัสขั้นสูงที่ใช้คีย์ขนาด 256 บิต คือ cipher สมัยใหม่ที่แนะนำสำหรับการเข้ารหัสเนื้อหา PDF
  • User password (open password) ความลับที่จำเป็นต้องใช้เพื่อเปิดและอ่านเอกสารที่ถูกเข้ารหัส หากไม่มีมัน เนื้อหาจะถอดรหัสไม่ได้
  • Owner password (permissions password) ความลับ “สิทธิ์เต็ม” ที่ควบคุมแฟล็กสิทธิ์ เอกสารสามารถมีมันได้โดยไม่ต้องใช้ user password เพื่อเปิด
  • Permission flags เจตนาเรื่องพิมพ์/คัดลอก/แก้ไขที่ประกาศไว้ ซึ่งถูกเก็บใน encryption dictionary ถูกปกป้องความถูกต้องครบถ้วนเพื่อให้การไปยุ่งถูกตรวจจับได้ แต่ได้รับการเชื่อฟังเฉพาะจากโปรแกรมอ่านที่ให้ความร่วมมือเท่านั้น
  • Security handler ส่วนประกอบที่อนุมานคีย์เข้ารหัสไฟล์จากรหัสผ่าน นิยามโดย standard security handler ใน ISO 32000-2
  • Reader-cooperative การควบคุมที่ขึ้นอยู่กับซอฟต์แวร์ผู้บริโภคเลือกที่จะเชื่อฟัง แทนที่จะถูกบังคับใช้โดยไฟล์เอง