Bỏ qua để đến nội dung
getnextpdf.com

Mã hóa PDF thật sự hoạt động ra sao — và các giới hạn của nó

Spec: ISO 32000-2, §7.6

Mã hóa PDF xáo trộn các từ ngữ và hình ảnh bên trong một tài liệu để chỉ người có đúng mật khẩu mới đọc được chúng. Đó là mật mã học thực thụ, và nó làm tốt công việc duy nhất nó có. Nó cũng bị hiểu lầm rộng rãi, vì cùng tính năng đó mang theo một cơ chế thứ hai — các cờ quyền — trông giống một ổ khóa nhưng không phải.

Trang này tách hai thứ đó ra. Nó giải thích AES-256 thực sự bảo vệ điều gì, hai mật khẩu thực sự dùng để làm gì, và ranh giới thẳng thắn nằm ở đâu.

Người ta tìm tới mã hóa khi một tài liệu nhạy cảm: một hợp đồng, một bảng lương, một thư y tế. Kỳ vọng là hợp lý — hãy giữ riêng tư cái này, và ngăn người ta in hay sao chép nó. PDF đáp ứng nửa đầu của mong muốn đó một cách thuyết phục và nửa sau chỉ trên cơ sở danh dự.

Nhầm lẫn hai thứ là nơi cái giá phải trả rơi xuống. Một nhóm đánh dấu một tệp “không cho sao chép”, tin rằng nền tảng cưỡng chế điều đó, và xuất bản. Vài tháng sau ai đó sao chép văn bản trong ba mươi giây bằng một trình đọc khác, và giả định chưa bao giờ đúng đó lặng lẽ biến thành một vụ rò rỉ. Mã hóa chưa từng bị phá vỡ. Nó đơn giản là được yêu cầu làm một việc mà nó không làm.

  • Mã hóa bảo vệ tính bảo mật. Với AES-256, nội dung chuỗi và luồng của một PDF là bản mã thực thụ. Không có khóa, nó không đọc được.
  • User password mở tài liệu. Cung cấp nó và bạn có thể thấy nội dung. Không có nó, không có gì để đọc.
  • Owner password chi phối các quyền. Nó là khóa “toàn quyền”. Các cờ quyền mà nó canh giữ — in, sao chép, sửa đổi — được ghi bên trong tài liệu đã mã hóa.
  • Các cờ quyền mang tính hợp tác với trình đọc. Chúng là một lời đề nghị với một trình đọc cư xử đúng mực, không phải sự cưỡng chế. Một trình đọc phớt lờ chúng vẫn có thể in, sao chép, hay chỉnh sửa.
  • Cấu trúc vẫn hiển thị. Mã hóa giấu nội dung, không phải bộ khung của tài liệu — số trang và bố cục đối tượng không phải là bí mật.

Mã hóa PDF được định nghĩa bởi Spec: ISO 32000-2, §7.6. Mô hình rất chính xác: một security handler dẫn xuất một khóa mã hóa tệp từ một mật khẩu, các chuỗi và luồng của tài liệu được mã hóa bằng khóa đó, và một encryption dictionary — được tham chiếu từ trailer của tệp — ghi lại mật mã nào đã được dùng, khóa dài bao nhiêu, và tác giả đã khai báo những quyền nào.

Mật mã hiện đại được khuyến nghị là AES với một khóa 256 bit. Khi bạn mã hóa một PDF theo cách này, phần tải có thể đọc được — văn bản bạn sẽ trích xuất, các byte hình ảnh, dữ liệu font — được biến đổi thành bản mã. Hình dạng bên ngoài của tài liệu vẫn dễ đọc theo thiết kế: một trình đọc phải tìm encryption dictionary và biết độ dài khóa trước khi nó có thể hỏi bạn một mật khẩu. Đó là lý do mã hóa được hiểu đúng nhất là tính bảo mật của nội dung, không phải sự che kín của toàn bộ tệp.

Hai mật khẩu nằm ở các tầng khác nhau, và sự phân biệt là phần đáng nắm cho đúng nhất.

  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 là mật khẩu mở. Nó trả lời một câu hỏi: bạn có được phép thấy nội dung chút nào không? Không có user password, không có tài liệu đọc được — phần đó được cưỡng chế bằng mật mã, vì không có khóa đã dẫn xuất thì không có gì để giải mã.

Owner password là mật khẩu quyền. Một tệp có thể được bất kỳ ai mở (không cần user password) nhưng vẫn khai báo một owner password canh giữ các hành động “toàn quyền” — in ở độ phân giải cao, sao chép văn bản, sửa đổi tệp. Quan trọng là, các bit quyền mà owner password bảo vệ được bảo vệ toàn vẹn bởi security handler tiêu chuẩn: việc giả mạo chúng bị một trình đọc hợp quy phát hiện và từ chối, vì handler ràng buộc các quyền đã khai báo với các khóa mã hóa. Các bit này không phải là các byte không đọc được hay không sửa được theo nghĩa đen — một kẻ tấn công có thể thay đổi chúng — nhưng một bản sao đã bị thay đổi sẽ không xác thực được, nên một trình đọc hợp quy coi nó là hỏng. Chúng có tính phát hiện-giả-mạo. Chúng đơn giản là không tự cưỡng chế.

Các thiết lập mã hóa dễ diễn đạt. Điều quan trọng là đọc kết quả một cách thẳng thắn: cái này cấu hình ý định, và phần quyền trong ý định đó chỉ là khuyến nghị.

<?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 và owner password là các khóa khác nhau với các công việc khác nhau. Đối số permissions nêu những gì một trình đọc cư xử đúng mực nên cho phép. Đó là siêu dữ liệu thẳng thắn, được bảo vệ toàn vẹn bởi security handler để việc giả mạo có thể phát hiện được — và đó là trần của những gì một thư viện sản xuất có thể hứa hẹn.

Cái bẫy là đọc “quyền” thành “cưỡng chế”. Nó rất trực giác: cờ nói không cho in, nên chắc chắn việc in bị chặn. Nhưng không gì trong PDF có thể vươn ra và vô hiệu hóa nút in của một trình đọc. Số nguyên quyền được ghi lại để một trình đọc hợp tác tuân theo. Một trình đọc chọn không hợp tác — và vài trình đọc không hợp tác — có quyền tự do in, sao chép, và chỉnh sửa.

NextPDF có chủ đích về điều này. Đường mã hóa lõi coi các cờ quyền là ý định đã khai báo và không bao giờ giả vờ cưỡng chế chúng. Nếu bạn cần các hành động thực sự bị ngăn chặn, biện pháp kiểm soát đó phải nằm bên ngoài tệp — ở việc bạn trao tài liệu cho ai, hoặc trong một hệ thống kiểm soát truy cập bao quanh nó.

Hãy chính xác về điều mà mỗi nửa bảo đảm. Mã hóa (tầng user password) là một biện pháp kiểm soát bảo mật thực thụ: mạnh nếu mật khẩu mạnh, và chỉ tốt ngang với bí mật bạn chọn. Các quyền (tầng owner password) là siêu dữ liệu có tính phát hiện-giả-mạo, không phải kiểm soát truy cập.

Điều bạn có thể trông đợiĐiều mã hóa thực sự mang lại
Không ai có thể đọc nội dung mà không có mật khẩuĐúng. Với AES-256 và một user password mạnh, các chuỗi và luồng không đọc được nếu không có khóa. Được cưỡng chế thực sự.
Không ai có thể viết lại “không cho sao chép” thành “cho phép sao chép”Có tính phát hiện-giả-mạo, không phải bất khả thi. Các cờ quyền được bảo vệ toàn vẹn bởi security handler tiêu chuẩn: một người ngoài có thể chỉnh các byte, nhưng bản sao đã thay đổi sẽ không xác thực được, nên một trình đọc hợp quy phát hiện và từ chối thay đổi đó.
Trình đọc sẽ bị ngăn không cho sao chép hay inKhông được bảo đảm bởi bất kỳ bộ sản xuất PDF nào. Một trình đọc không hợp tác có thể phớt lờ các cờ. Đây là một tính chất của định dạng, không phải một giới hạn của NextPDF.

Hai ranh giới nữa đáng nêu thẳng thắn. Thứ nhất, mã hóa bảo vệ nội dung, không phải cấu trúc của tài liệu: bố cục đối tượng và số trang vẫn hiển thị, điều này là bình thường và cần thiết để một trình đọc định vị được encryption dictionary. Thứ hai, một PDF đã mã hóa không thể đồng thời tuyên bố tuân thủ lưu trữ PDF/A — profile đó cấm mục Encrypt, nên bạn chọn cái này hoặc cái kia. Trang xử lý sự cố mã-hóa-và-quyền trình bày các ngoại lệ cụ thể và việc PDF/A từ chối một cách chi tiết.

  • AES-256 — Advanced Encryption Standard với một khóa 256 bit, mật mã hiện đại được khuyến nghị cho mã hóa nội dung PDF.
  • User password (mật khẩu mở) — bí mật cần để mở và đọc một tài liệu đã mã hóa. Không có nó, nội dung không thể giải mã được.
  • Owner password (mật khẩu quyền) — bí mật “toàn quyền” chi phối các cờ quyền. Một tài liệu có thể có nó mà không yêu cầu một user password để mở.
  • Cờ quyền — ý định in/sao chép/sửa đổi đã khai báo, được lưu trong encryption dictionary. Được bảo vệ toàn vẹn để việc giả mạo có thể phát hiện được, nhưng chỉ được tuân theo bởi một trình đọc hợp tác.
  • Security handler — thành phần dẫn xuất khóa mã hóa tệp từ một mật khẩu, được định nghĩa bởi security handler tiêu chuẩn trong ISO 32000-2.
  • Hợp tác với trình đọc (reader-cooperative) — một biện pháp kiểm soát phụ thuộc vào việc phần mềm tiêu thụ chọn tuân theo nó, thay vì được cưỡng chế bởi chính tệp.