暗号化(HasSecurity)
Document の HasSecurity トレイトは、Aes256Encryptor エンジンを通じてAES-256暗号化を提供します。TCPDF-NextはPDF 2.0セキュリティハンドラー(AESV3、リビジョン6、V5)のみを実装しており、RC4およびAES-128は意図的に削除されています。パスワードは適切なUnicode処理のためにSASLprep(RFC 4013)で正規化され、鍵導出にはアルゴリズム2.B(反復SHA-256/384/512)が使用されます。
クイックリファレンス
| メソッド | 説明 |
|---|---|
setProtection() | 権限とパスワードによるAES-256暗号化を有効化 |
暗号化の有効化
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->setProtection(
permissions: ['print', 'copy'],
userPass: 'reader-password',
ownerPass: 'owner-secret-password',
)
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'This PDF is AES-256 encrypted', newLine: true)
->save('encrypted.pdf');setProtection() は static を返すため、他のすべての Document メソッドとチェーンできます。
$pdf->setProtection(
array $permissions = [], // 権限フラグ(下記の表を参照)
string $userPass = '', // ドキュメントを開くために必要なパスワード
string $ownerPass = '', // 無制限アクセス用のパスワード
);ユーザーパスワードとオーナーパスワード
- ユーザーパスワード — 読者がPDFを開いて閲覧するために入力する必要があるパスワードです。空の場合、ドキュメントはプロンプトなしで開きますが、権限の制限は引き続き適用されます。
- オーナーパスワード — ドキュメントへの完全なアクセスを許可し、すべての権限制限をバイパスします。空の場合、ランダムな32バイトのオーナーパスワードが内部的に生成されます。
両方のパスワードは鍵導出の前にSASLprep(RFC 4013)で正規化されます。これにより、"Pässwörd" のようなUnicodeパスワードがすべてのPDFビューアで一貫して処理されることが保証されます。
権限フラグ
$permissions 配列に以下の文字列フラグの任意の組み合わせを渡します:
| フラグ | 説明 |
|---|---|
print | 印刷を許可(低解像度) |
modify | コンテンツの変更を許可 |
copy | テキストと画像の抽出を許可 |
annotate | 注釈の追加を許可 |
fill-forms | フォームフィールドの入力を許可 |
extract | アクセシビリティ抽出を許可 |
assemble | ページの挿入、回転、削除を許可 |
print-highres | 高解像度印刷を許可 |
$permissions が空の場合、すべての操作が制限されます(いかなるアクションにもオーナーパスワードが必要)。
オーナー専用暗号化
開封時にパスワードを要求せずに権限を制限するには:
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->setProtection(
permissions: ['print', 'fill-forms'],
ownerPass: 'admin-password',
)
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Open freely, but only print and fill forms.', newLine: true)
->save('restricted.pdf');ドキュメントはパスワードプロンプトなしで開きますが、オーナーパスワードが提供されない限り、変更、コピー、注釈はブロックされます。
セキュリティアーキテクチャ
TCPDF-Nextは最も強力なPDF暗号化標準のみを適用します:
- アルゴリズム: AES-256-CBC(AESV3)、リビジョン6、V5
- 鍵長: 256ビット
- レガシーなし: RC4およびAES-128は意図的に削除済み
SASLprepパスワード正規化
SaslPrep クラス(RFC 4013)は、NFKC Unicode正規化でパスワードを正規化し、禁止文字を拒否し、双方向テキストの制約を適用します。これにより、プラットフォームや入力方法に関係なく同一のハッシュが保証されます。
鍵導出 — アルゴリズム2.B
ISO 32000-2アルゴリズム2.Bは、反復SHA-256/384/512ハッシュ(最大64ラウンド)を通じて暗号化鍵を導出し、ブルートフォース攻撃に対する強力な耐性を提供します。
PDF/Aとの非互換性
暗号化はPDF/A準拠ドキュメントでは許可されていません。PDF/Aモードが有効なドキュメントで setProtection() を呼び出そうとすると、PdfAException がスローされます:
use Yeeefang\TcpdfNext\Core\Document;
// これはPdfAExceptionをスローします
$pdf = Document::create()
->setPdfA(true)
->setProtection(permissions: ['print'], ownerPass: 'secret');
// -> throws PdfAException: "Encryption is not allowed in PDF/A documents"アーカイブ準拠とアクセス制御の両方が必要な場合は、権限制限付きのデジタル署名の使用を検討してください。
完全な例
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->setTitle('Confidential Report')
->setAuthor('Security Team')
->setProtection(
permissions: ['print-highres', 'copy'],
userPass: 'open-me',
ownerPass: 'full-access-2026',
)
->addPage()
->setFont('Helvetica', 'B', 18)
->cell(0, 15, 'Confidential Report', newLine: true)
->setFont('Helvetica', '', 12)
->multiCell(0, 6, 'This document is protected with AES-256 encryption. '
. 'Readers can print and copy, but cannot modify or annotate.')
->save('confidential-report.pdf');