Skip to content

暗号化(HasSecurity)

DocumentHasSecurity トレイトは、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暗号化を有効化

暗号化の有効化

php
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 メソッドとチェーンできます。

php
$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 が空の場合、すべての操作が制限されます(いかなるアクションにもオーナーパスワードが必要)。

オーナー専用暗号化

開封時にパスワードを要求せずに権限を制限するには:

php
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 がスローされます:

php
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"

アーカイブ準拠とアクセス制御の両方が必要な場合は、権限制限付きのデジタル署名の使用を検討してください。

完全な例

php
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');

LGPL-3.0-or-later ライセンスの下で公開されています。