콘텐츠로 이동

AES-256으로 PDF를 암호화하고 권한 설정하기

이 레시피에서는 AES-256으로 문서를 암호화합니다. 사용자 암호와 소유자 암호를 설정하고, 권한 비트마스크로 작업을 제한합니다. 이 레시피는 examples/22-protection.php를 따릅니다.

재현성 — 이 레시피가 structural이고 bitwise가 아닌 이유. AES-256 PDF는 동일한 입력과 암호를 사용하더라도 두 번 실행했을 때 바이트 단위로 결코 동일할 수 없습니다. 리비전 6 표준 보안 핸들러는 암호화할 때마다 16개의 새로운 무작위 바이트(user/owner 검증 및 키 솔트)를 파일 암호화 키를 도출하기 전에 강력한 난수 생성기로 생성합니다 (ISO 32000-2 §7.6.4, Algorithm 2.B). AES-256-CBC는 객체마다 무작위 초기화 벡터를 사용합니다. 트레일러 /ID 역시 두 개의 바이트 문자열로 이루어진 배열이며, 그 첫 번째 요소는 생성 시점에 파일로부터 도출된 영구 식별자입니다 (ISO 32000-2 §14.4). 따라서 재현성 프로파일은 structural입니다. 테스트 하니스는 두 번의 실행을 비교하기 전에 암호화 솔트/IV, 객체 순서, 트레일러 /ID를 불가능한 바이트 일치를 단언하는 대신 정규화합니다.

  • Core가 설치되어 있어야 합니다: composer require nextpdf/core:^3.
  • AES-256 암호화기가 사용하는 openssl PHP 확장이 활성화되어 있어야 합니다.
  1. 문서를 생성합니다.
  2. setEncryption() 메서드를 먼저 호출한 뒤 addPage()를 호출합니다. 콘텐츠 객체가 작성되기 전에 암호화기가 준비되어 있어야 합니다.
  3. 사용자 암호(문서를 여는 데 필요), 소유자 암호(전체 액세스), 권한 비트마스크를 전달합니다.
  4. 콘텐츠를 추가하고 저장합니다. 라이터는 각 객체 본문을 암호화합니다.
<?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)

encrypted.pdf 파일을 열면 암호 입력 메시지가 표시됩니다. 사용자 암호로는 제한된 권한 집합으로 문서가 열립니다. 소유자 암호로는 전체 액세스 권한으로 문서가 열립니다.

  • 호출 순서. setEncryption()addPage() 뒤에 호출하면 이미 작성된 콘텐츠는 소급해 암호화되지 않습니다. 항상 암호화를 먼저 구성하십시오.
  • 소유자 암호 기본값. 소유자 암호가 비어 있으면 엔진은 사용자 암호를 소유자 암호로 재사용합니다. 두 역할이 서로 달라야 할 때는 별도의 암호를 설정하십시오.
  • 권한의 의미 — 경계. 권한 비트는 규격을 준수하는 리더가 존중합니다. 권한 비트는 암호학적으로 강제되지 않습니다. 비트를 무시하는 리더나 소유자 암호와 함께 사용되는 도구는 제한 대상 작업을 수행할 수 있습니다. 권한은 작정한 공격자를 막는 접근 제어가 아니라, 협조적인 소프트웨어에 전달하는 정책 신호로 취급하십시오.
  • PDF/A 충돌. PDF/A는 Encrypt 트레일러 키를 금지합니다. PDF/A 문서에서 setEncryption()을 어떤 순서로 호출해도 비호환성 예외가 발생합니다. PDF/A-4 적합성 게이트를 참조하십시오.
  • AES-256-GCM. useAesGcm()은 호스트 OpenSSL 또는 libsodium이 해당 암호를 제공할 때 ISO/TS 32003 GCM 대량 암호화를 선택합니다. 그렇지 않으면 InvalidConfigException을 발생시킵니다.
진술사양reference_id(참조 ID)
표준 보안 핸들러는 암호화 알고리즘과 키 길이를 정의합니다.ISO 32000-2§7.6
암호화 딕셔너리 P 항목은 권한 비트를 담습니다.ISO 32000-2§7.6

암호화는 암호가 없는 당사자로부터 콘텐츠의 기밀성을 보호합니다. 권한 비트는 리더에 대한 권고 사항이며, 그 자체만으로는 규격을 준수하지 않는 도구의 동작을 막지 못합니다.