Lewati ke konten
getnextpdf.com

Trait Core / HasSecurity

HasSecurity adalah trait concern untuk proteksi dokumen. Gunakan trait ini untuk mengatur enkripsi AES-256, izin akses, tagged PDF, dan delegasi tanda tangan digital.

Terminal window
composer require nextpdf/core:^3

trait HasSecurity berada di src/Core/Concerns/HasSecurity.php. Document menyertakannya. Trait ini menambahkan metode enkripsi, penandatanganan, PDF/A, dan tagged PDF pada facade.

Panggil setEncryption() untuk mengunci dokumen. Berikan kata sandi pengguna, kata sandi pemilik yang opsional, dan bitmask izin. Kata sandi pengguna digunakan untuk membuka dokumen. Kata sandi pemilik memberikan akses penuh. Jika kata sandi pemilik kosong, mesin menggunakan kembali kata sandi pengguna. Cipher bawaannya adalah AES-256.

Untuk menerapkan kontrol izin yang ketat, lakukan langkah berikut:

  1. Pilih bit izin yang Anda izinkan.
  2. Panggil setEncryption() sebelum Anda menambahkan halaman apa pun.
  3. Tambahkan halaman dan konten.

Bit izin mengikuti ISO 32000-2:2020 Tabel 22. Bit 3 mengizinkan pencetakan. Bit 4 mengizinkan modifikasi konten. Bit 5 mengizinkan ekstraksi teks. Bit 6 mengizinkan perubahan anotasi dan formulir.

Penangan keamanan PDF menghitung kunci enkripsi berkas (ISO 32000-2:2020 §7.6.2). Kode V dalam kamus enkripsi memilih algoritmanya. Nilai V legasi yang lebih rendah ditandai sebagai usang di PDF 2.0. NextPDF menghasilkan penangan AES-256 modern. Pembaca PDF memverifikasi kata sandi yang diberikan terhadap entri U pada kamus (§7.6.4).

useAesGcm() mengaktifkan enkripsi massal AES-256-GCM (Galois/Counter Mode) ISO/TS 32003:2023. Mode ini dinonaktifkan secara default. Pemanggil yang sudah ada tetap menerima keluaran AES-256-CBC (Cipher Block Chaining) yang identik secara byte. Metode ini menolak dijalankan ketika mode PDF/A aktif. Metode ini juga menolak dijalankan ketika host tidak dapat menjalankan AES-GCM.

setSignature() mengonfigurasi tanda tangan PDF Advanced Electronic Signatures (PAdES). Berikan sertifikat, level tanda tangan, dan klien stempel waktu yang opsional. Penandatanganan harus dijalankan sebelum linearisasi. setEncryption() menerima kata sandi #[SensitiveParameter], sehingga nilainya tidak muncul dalam stack trace.

enableTaggedPdf() membangun pohon struktur untuk PDF/UA-2. Berikan tag bahasa BCP-47. Mode ketat memvalidasi tag di batas application programming interface (API). Tag yang tidak valid memicu InvalidConfigException. enablePdfA() mengaktifkan mode arsip PDF/A. enableLinearization() menghasilkan berkas terlinearisasi.

SimbolJenisStabilitasSejak
setEncryption(string, string, int): staticmetodestabil1.2.0
getEncryptor(): ?Aes256Encryptormetodestabil1.2.0
useAesGcm(?bool): staticmetodestabil1.4.0
setPublicKeyEncryption(...): staticmetodestabil1.2.0
setSignature(CertificateInfo, SignatureLevel, ?TsaClient): staticmetodestabil1.2.0
enablePdfA(?object): staticmetodestabil1.2.0
enableTaggedPdf(string, ?ConformancePolicy): staticmetodestabil1.0.0
setConformanceMode(ConformanceMode): staticmetodestabil2.8.0
useDocumentMac(?bool): staticmetodestabil1.4.0
enableLinearization(): staticmetodestabil1.2.0
<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->setTitle('Encrypted Document — Restricted Permissions');
$doc->setAuthor('NextPDF Example');
// Enable AES-256 encryption BEFORE adding any pages.
$doc->setEncryption(
userPassword: 'demo',
ownerPassword: 'admin',
permissions: 4, // 4 = allow printing only
);
$doc->addPage();
$doc->setFont('helvetica', 'B', 20);
$doc->cell(0, 14, 'Encrypted PDF Document', newLine: true);
$doc->save(__DIR__ . '/output/22-protection.pdf');

Sumber: examples/22-protection.php.

Aktifkan AES-256-GCM, lalu terapkan tagged PDF untuk aksesibilitas.

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->setTitle('Protected and Tagged');
$doc->setEncryption(userPassword: 'open-me', permissions: 4);
$doc->useAesGcm(true);
$doc->enableTaggedPdf('en');
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->cell(0, 10, 'AES-256-GCM encrypted and PDF/UA-2 tagged.', newLine: true);
$doc->save(__DIR__ . '/output/protected-tagged.pdf');

Sumber: disusun dari examples/22-protection.php dan examples/31-pdfua2-tagged.php.

  • Panggil setEncryption() sebelum addPage() yang pertama. Panggilan setelah itu tidak memengaruhi halaman yang sudah dihasilkan.
  • useAesGcm(true) melempar eksepsi ketika mode PDF/A aktif. ISO 19005 melarang kunci trailer Encrypt.
  • useAesGcm(true) melempar eksepsi ketika host tidak memiliki cipher AES-GCM. Pasang ext-sodium atau mutakhirkan OpenSSL.
  • setSignature() tidak kompatibel dengan linearisasi. Konfigurasikan tanda tangan sebelum Anda mengaktifkan linearisasi.
  • Jika kata sandi pemilik kosong, sistem menggunakan kembali kata sandi pengguna. Tetapkan kata sandi pemilik yang berbeda untuk kontrol akses yang sebenarnya.

Enkripsi menambahkan satu lintasan cipher pada setiap badan objek. AES-256-CBC dan AES-256-GCM keduanya berjalan dalam O(content bytes). Biayanya kecil dibandingkan proses tata letak. Anggaran halaman untuk mulai cepat kanonis adalah 1500 ms / 64 MB.

Kata sandi pengguna dan kata sandi pemilik menggunakan atribut #[SensitiveParameter]. PHP menyamarkan nilainya dalam stack trace. Mesin tidak pernah mencatat nilai kata sandi. Bitmask izin diekspos pada model dokumen bagi penulis. Bitmask tidak dibaca ulang dari status cipher privat.

NextPDF berjalan dalam proses Anda. Core tidak melakukan panggilan jaringan untuk material kunci enkripsi atau penandatanganan. Kata sandi tetap berada dalam memori proses. Kata sandi tidak ditulis ke disk. Panggilan ke hardware security module (HSM) merupakan fitur Enterprise; panggilan ke stempel waktu RFC 3161 (level B-T) tersedia mulai dari Core ke atas. Panggilan tersebut mengakses jaringan secara eksplisit. Core tidak melakukan panggilan jaringan lainnya.

Core tidak mengirim telemetri secara default. Peringatan disalurkan melalui WarningCollector. Nilai kata sandi tidak pernah masuk ke pesan peringatan. Peringatan mengidentifikasi kunci konfigurasi, bukan nilai rahasianya. Jangan menambahkan kata sandi ke baris log kustom.

Ancaman utama adalah injeksi string ke aliran konten melalui teks pengguna. Mesin meng-escape setiap string teks sebelum memasukkannya ke aliran. Peta escape mencakup batas literal-string dan hex-string PDF sesuai ISO 32000-2:2020 §7.3.4.2. Ancaman kedua adalah penulisan berkas parsial saat keluaran ditulis. HasOutput::save() menggunakan penulisan atomik. Pembaca melihat berkas lama atau berkas baru, tidak pernah berkas parsial. Ancaman ketiga adalah cipher yang lemah. NextPDF menghasilkan AES-256 dan menandai jalur RC4 legasi sebagai usang.

Config menerima CryptoPolicyInterface. Kebijakan Federal Information Processing Standards (FIPS) 140-3 dapat membatasi pemilihan cipher. Jika host tidak memiliki penyedia AES-GCM yang disetujui, useAesGcm(true) melempar eksepsi alih-alih beralih ke cadangan. Perilaku fail-closed ini menjaga dokumen tetap berada dalam kebijakan yang dikonfigurasi.

KlaimSumberKlausul
Penangan keamanan menghitung kunci enkripsi berkas; V memilih algoritmanyaISO 32000-2:2020§7.6.2
Kode V memilih algoritma enkripsi; nilai V legasi ditandai usang di PDF 2.0ISO 32000-2:2020§7.6.2
Kata sandi pengguna diverifikasi terhadap entri UISO 32000-2:2020§7.6.4

Klausul diparafrasekan. Tidak ada teks normatif yang direproduksi.