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 암호화기가 사용하는
opensslPHP 확장이 활성화되어 있어야 합니다.
레시피
섹션 제목: “레시피”- 문서를 생성합니다.
setEncryption()메서드를 먼저 호출한 뒤addPage()를 호출합니다. 콘텐츠 객체가 작성되기 전에 암호화기가 준비되어 있어야 합니다.- 사용자 암호(문서를 여는 데 필요), 소유자 암호(전체 액세스), 권한 비트마스크를 전달합니다.
- 콘텐츠를 추가하고 저장합니다. 라이터는 각 객체 본문을 암호화합니다.
전체 예제
섹션 제목: “전체 예제”<?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 |
암호화는 암호가 없는 당사자로부터 콘텐츠의 기밀성을 보호합니다. 권한 비트는 리더에 대한 권고 사항이며, 그 자체만으로는 규격을 준수하지 않는 도구의 동작을 막지 못합니다.