Lewati ke konten

Enkripsi PDF dengan AES-256 dan pengaturan izin

Gunakan resep ini untuk mengenkripsi dokumen dengan AES-256. Anda akan menetapkan kata sandi pengguna, kata sandi pemilik, dan bitmask izin yang membatasi operasi yang diperbolehkan. Resep ini mengikuti examples/22-protection.php.

Reprodusibilitas — mengapa resep ini bersifat structural, bukan bitwise. Sebuah PDF AES-256 tidak pernah identik byte demi byte antareksekusi, bahkan dengan input yang sama dan kata sandi yang sama. Sebelum menurunkan kunci enkripsi berkas, standard security handler revisi-6 menghasilkan 16 byte acak baru (salt validasi dan kunci user/owner) untuk setiap enkripsi dengan generator angka acak yang kuat (ISO 32000-2 §7.6.4, Algorithm 2.B). AES-256-CBC menggunakan vektor inisialisasi acak untuk setiap objek. Entri trailer /ID juga merupakan larik berisi dua string byte. Elemen pertamanya adalah pengidentifikasi permanen yang diturunkan dari berkas pada saat pembuatan (ISO 32000-2 §14.4). Oleh karena itu, profil reprodusibilitasnya bersifat structural: sebelum membandingkan dua eksekusi, harness mengkanonikalisasi salt/IV enkripsi, urutan objek, dan /ID trailer, alih-alih menegaskan kecocokan byte yang mustahil.

  • Core telah terpasang: composer require nextpdf/core:^3.
  • Ekstensi PHP openssl, yang diperlukan oleh encryptor AES-256.
  1. Buat dokumen.
  2. Panggil setEncryption() sebelum addPage(). Encryptor harus siap sebelum objek konten apa pun ditulis.
  3. Berikan kata sandi pengguna (diperlukan untuk membuka dokumen), kata sandi pemilik (untuk akses penuh), dan bitmask izin.
  4. Tambahkan konten, lalu simpan. Writer akan mengenkripsi badan setiap objek.
<?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)

Saat Anda membuka encrypted.pdf, pembaca akan meminta kata sandi. Kata sandi pengguna membuka dokumen dengan kumpulan izin yang dibatasi. Kata sandi pemilik membukanya dengan akses penuh.

  • Urutan pemanggilan. setEncryption() setelah addPage() tidak mengenkripsi konten sebelumnya secara retroaktif. Selalu konfigurasikan enkripsi terlebih dahulu.
  • Kata sandi pemilik bawaan. Ketika kata sandi pemilik kosong, engine menggunakan kembali kata sandi pengguna sebagai kata sandi pemilik. Tetapkan kata sandi yang berbeda ketika kedua peran ini perlu dibedakan.
  • Semantik izin — batasan. Pembaca yang patuh akan menghormati bit izin tersebut. Bit-bit ini tidak ditegakkan secara kriptografis: pembaca yang mengabaikan bit tersebut, atau alat yang digunakan dengan kata sandi pemilik, dapat melakukan operasi yang dibatasi. Perlakukan izin sebagai sinyal kebijakan bagi perangkat lunak yang kooperatif, bukan sebagai kontrol akses yang tahan terhadap pihak yang bertekad.
  • Konflik dengan PDF/A. PDF/A melarang kunci trailer Encrypt. Memanggil setEncryption() pada dokumen PDF/A, dalam urutan mana pun, akan melempar eksepsi ketidakcocokan. Lihat Gerbang konformansi PDF/A-4.
  • AES-256-GCM. useAesGcm() mengaktifkan enkripsi massal GCM ISO/TS 32003 ketika OpenSSL atau libsodium pada host menyediakan cipher tersebut. Jika tidak tersedia, pemanggilan ini akan melempar InvalidConfigException.
PernyataanSpesifikasiKlausulreference_id
Standard security handler menentukan algoritma enkripsi dan panjang kunci.ISO 32000-2§7.6
Entri P pada encryption dictionary membawa bit izin.ISO 32000-2§7.6

Enkripsi melindungi kerahasiaan konten dari pihak yang tidak memiliki kata sandi. Bit izin bersifat anjuran bagi pembaca dan, dengan sendirinya, tidak mencegah alat yang tidak patuh untuk melakukan tindakan.