Bỏ qua để đến nội dung

Mã hóa PDF bằng AES-256 và thiết lập quyền

Hãy dùng công thức này để mã hóa tài liệu bằng AES-256. Bạn đặt mật khẩu người dùng, mật khẩu chủ sở hữu và bitmask quyền để giới hạn những thao tác được phép. Công thức này dựa trên examples/22-protection.php.

Khả năng tái lập — vì sao công thức này là structural chứ không phải bitwise. Một tệp PDF AES-256 không bao giờ giống hệt từng byte giữa các lần chạy, ngay cả với cùng đầu vào và cùng mật khẩu. Trước khi dẫn xuất khóa mã hóa tệp, trình xử lý bảo mật chuẩn revision-6 tạo mới 16 byte ngẫu nhiên (các salt xác thực user/owner và salt khóa) cho mỗi lần mã hóa bằng bộ tạo số ngẫu nhiên mạnh (ISO 32000-2 §7.6.4, Algorithm 2.B). AES-256-CBC dùng một vector khởi tạo ngẫu nhiên cho mỗi đối tượng. Trường trailer /ID cũng là một mảng gồm hai chuỗi byte. Phần tử đầu tiên là một định danh cố định được dẫn xuất từ tệp tại thời điểm tạo (ISO 32000-2 §14.4). Vì vậy hồ sơ khả năng tái lập là structural: trước khi so sánh hai lần chạy, bộ kiểm thử chuẩn hóa các salt/IV mã hóa, thứ tự đối tượng và trailer /ID, thay vì yêu cầu khớp byte, vốn là điều không thể.

  • Đã cài đặt Core: composer require nextpdf/core:^3.
  • Phần mở rộng PHP openssl, được bộ mã hóa AES-256 yêu cầu.
  1. Tạo tài liệu.
  2. Gọi setEncryption() trước addPage(). Bộ mã hóa phải sẵn sàng trước khi ghi bất kỳ đối tượng nội dung nào.
  3. Truyền vào mật khẩu người dùng (bắt buộc để mở tài liệu), mật khẩu chủ sở hữu (để có toàn quyền truy cập) và một bitmask quyền.
  4. Thêm nội dung rồi lưu. Trình ghi sẽ mã hóa phần thân của từng đối tượng.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// Permission bits (ISO 32000-2, encryption dictionary P entry):
// bit 3 (4) allow printing
// bit 4 (8) allow content modification
// bit 5 (16) allow text extraction / copying
// bit 6 (32) allow annotation and form editing
// Grant printing only:
$permissions = 4;
$doc = Document::createStandalone();
$doc->setTitle('Encrypted Document');
// setEncryption() MUST run before addPage(). Order matters.
$doc->setEncryption(
userPassword: 'open-me',
ownerPassword: 'owner-secret',
permissions: $permissions,
);
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->cell(0, 10, 'This document is encrypted with AES-256.', newLine: true);
$doc->save(__DIR__ . '/encrypted.pdf');
echo "Wrote encrypted.pdf (AES-256, printing only)\n";
Wrote encrypted.pdf (AES-256, printing only)

Khi mở encrypted.pdf, trình đọc sẽ yêu cầu nhập mật khẩu. Mật khẩu người dùng mở tài liệu với tập quyền bị giới hạn. Mật khẩu chủ sở hữu mở tài liệu với toàn quyền truy cập.

  • Thứ tự gọi. setEncryption() sau addPage() sẽ không tự động mã hóa nội dung đã thêm trước đó. Luôn cấu hình mã hóa trước.
  • Mật khẩu chủ sở hữu mặc định. Khi mật khẩu chủ sở hữu để trống, engine dùng lại mật khẩu người dùng làm mật khẩu chủ sở hữu. Hãy đặt mật khẩu riêng biệt khi hai vai trò này cần tách biệt.
  • Ngữ nghĩa quyền — giới hạn. Các trình đọc tuân thủ sẽ tôn trọng các bit quyền. Chúng không được cưỡng chế bằng mật mã: một trình đọc bỏ qua các bit, hoặc một công cụ dùng kèm mật khẩu chủ sở hữu, vẫn có thể thực hiện các thao tác bị giới hạn. Hãy coi quyền là tín hiệu chính sách cho phần mềm hợp tác, không phải là cơ chế kiểm soát truy cập có thể chống lại một bên cố tình vi phạm.
  • Xung đột với PDF/A. PDF/A cấm khóa trailer Encrypt. Gọi setEncryption() trên một tài liệu PDF/A, ở bất kỳ thứ tự nào, sẽ ném ra một exception do không tương thích. Xem Cổng kiểm tra tuân thủ PDF/A-4.
  • AES-256-GCM. useAesGcm() bật mã hóa khối lượng lớn GCM theo ISO/TS 32003 khi OpenSSL hoặc libsodium trên máy chủ cung cấp chế độ mã hóa này. Nếu không, nó sẽ ném ra InvalidConfigException.
Phát biểuĐặc tảĐiều khoảnreference_id
Trình xử lý bảo mật chuẩn định nghĩa thuật toán mã hóa và độ dài khóa.ISO 32000-2§7.6
Mục P trong từ điển mã hóa chứa các bit quyền.ISO 32000-2§7.6

Mã hóa bảo vệ tính bảo mật của nội dung trước các bên không có mật khẩu. Các bit quyền chỉ là khuyến nghị cho trình đọc; bản thân chúng không ngăn được một công cụ không tuân thủ thực hiện thao tác.