PDF 암호화가 실제로 작동하는 방식 — 그리고 그 한계
Spec: ISO 32000-2, §7.6ISO 32000-2 §7.6
한눈에 보기
섹션 제목: “한눈에 보기”PDF 암호화는 문서 안의 단어와 이미지를 뒤섞어, 올바른 비밀번호를 가진 사람만 그것을 읽을 수 있게 합니다. 그것은 진짜 암호학이며, 자신이 맡은 한 가지 일을 잘합니다. 그것은 또한 널리 오해받는데, 같은 기능이 두 번째 메커니즘 — 권한 플래그 — 을 함께 나르기 때문입니다. 그것은 잠금처럼 보이지만 잠금이 아닙니다.
이 페이지는 그 둘을 분리합니다. AES-256이 실제로 무엇을 보호하는지, 두 비밀번호가 정말로 무엇을 위한 것인지, 그리고 정직한 경계가 어디에 자리하는지 설명합니다.
이것이 중요한 이유
섹션 제목: “이것이 중요한 이유”사람들은 문서가 민감할 때 암호화에 손을 뻗습니다. 계약서, 급여 명세서, 의료 서신 같은 것들입니다. 그 기대는 합리적입니다 — 이것을 비밀로 유지하고, 사람들이 그것을 인쇄하거나 복사하지 못하게 하라는 것입니다. PDF는 그 소원의 전반부는 설득력 있게 들어주지만, 후반부는 오로지 신의 성실에 의존해서만 들어줍니다.
그 둘을 혼동하는 데서 비용이 발생합니다. 한 팀이 파일을 “복사 금지”로 표시하고, 플랫폼이 그것을 강제할 것이라 믿고, 출시합니다. 몇 달 뒤 누군가 다른 리더로 삼십 초 만에 텍스트를 복사하고, 결코 성립한 적 없던 그 가정은 조용히 유출로 바뀝니다. 암호화는 결코 깨지지 않았습니다. 그것은 단지 자신이 하지 않는 일을 하라는 요구를 받았을 뿐입니다.
짧게 요약하면
섹션 제목: “짧게 요약하면”- 암호화는 기밀성을 보호합니다. AES-256에서는 PDF의 문자열과 스트림 콘텐츠가 진짜 암호문입니다. 키가 없으면, 그것은 읽을 수 없습니다.
- 사용자 비밀번호는 문서를 엽니다. 그것을 제공하면 콘텐츠를 볼 수 있습니다. 그것이 없으면, 읽을 것이 아무것도 없습니다.
- 소유자 비밀번호는 권한을 다스립니다. 그것은 “완전한 권리” 키입니다. 그것이 지키는 권한 플래그 — 인쇄, 복사, 수정 — 는 암호화된 문서 안에 기록됩니다.
- 권한 플래그는 리더에게 협조를 구하는 것입니다. 그것들은 강제가 아니라 잘 행동하는 리더에게 보내는 요청입니다. 그것들을 무시하는 리더는 어쨌든 인쇄하고, 복사하고, 편집할 수 있습니다.
- 구조는 여전히 보입니다. 암호화는 콘텐츠를 숨기지, 문서의 골격을 숨기지 않습니다 — 페이지 수와 객체 레이아웃은 비밀이 아닙니다.
NextPDF가 이를 다루는 방식
섹션 제목: “NextPDF가 이를 다루는 방식”PDF 암호화는 Spec: ISO 32000-2, §7.6ISO 32000-2 §7.6에 정의되어 있습니다. 모델은 정밀합니다. 보안 핸들러가 비밀번호로부터 파일 암호화 키를 도출하고, 문서의 문자열과 스트림이 그 키로 암호화되며, 암호화 딕셔너리 — 파일 트레일러에서 참조됩니다 — 가 어떤 암호가 사용되었는지, 키가 얼마나 긴지, 그리고 저자가 어떤 권한을 선언했는지를 기록합니다.
현대의, 권장되는 암호는 256비트 키를 가진 AES입니다. 이런 식으로 PDF를 암호화하면, 읽을 수 있는 페이로드 — 여러분이 추출할 텍스트, 이미지 바이트, 폰트 데이터 — 가 암호문으로 변환됩니다. 문서의 바깥 형태는 설계상 읽을 수 있는 상태로 남습니다. 리더는 여러분에게 비밀번호를 요청하기 전에 암호화 딕셔너리를 찾아 키 길이를 알아야 하기 때문입니다. 그것이 바로 암호화가 전체 파일의 불투명성이 아니라 콘텐츠 기밀성으로 가장 잘 이해되는 이유입니다.
두 비밀번호는 서로 다른 계층에 자리하며, 그 구분이 제대로 짚어 둘 가치가 가장 큰 부분입니다.
- A password is suppliedEither the user password (open) or the owner password (full rights).
- The security handler derives the keyISO 32000-2 §7.6.4 turns the password into the file encryption key.
- Content is decryptedAES-256 turns the encrypted strings and streams back into readable bytes.
- Permissions are consultedThe owner key grants all rights; the user key is bound by the declared permission flags — if the reader chooses to honour them.
사용자 비밀번호는 열기 비밀번호입니다. 그것은 한 가지 질문에 답합니다. 콘텐츠를 도대체 볼 수 있는가? 사용자 비밀번호가 없으면, 읽을 수 있는 문서도 없습니다 — 그 부분은 암호학적으로 강제되는데, 도출된 키가 없으면 복호화할 것이 아무것도 없기 때문입니다.
소유자 비밀번호는 권한 비밀번호입니다. 파일은 누구에게나 열릴 수 있으면서도(사용자 비밀번호 없음), “완전한 권리” 행위 — 고해상도로 인쇄하기, 텍스트 복사하기, 파일 수정하기 — 를 통제하는 소유자 비밀번호를 여전히 선언할 수 있습니다. 결정적으로, 소유자 비밀번호가 보호하는 권한 비트는 표준 보안 핸들러에 의해 무결성이 보호됩니다. 그것을 변조하면 적합한 리더가 그것을 탐지하고 거부하는데, 핸들러가 선언된 권한을 암호화 키에 결속하기 때문입니다. 그 비트는 문자 그대로 읽을 수 없거나 편집할 수 없는 바이트는 아닙니다 — 공격자는 그것을 바꿀 수 있습니다 — 하지만 변경된 사본은 검증되지 않으므로, 적합한 리더는 그것을 손상된 것으로 취급합니다. 그것들은 변조 증거를 남깁니다. 다만 그것들은 스스로를 강제하지 않을 뿐입니다.
실제 예시
섹션 제목: “실제 예시”암호화 설정은 표현하기에 단순합니다. 중요한 것은 그 결과를 정직하게 읽는 것입니다. 이것은 의도를 설정하며, 그 의도의 권한 부분은 권고적입니다.
<?php
declare(strict_types=1);
use NextPDF\Core\Document;use NextPDF\Security\Encryption\EncryptionMode;use NextPDF\Security\Encryption\Permission;
$document = Document::createStandalone();$document->setTitle('Confidential Offer');$document->addPage();
// Confidentiality is real: AES-256 means the content is unreadable// without the user password. This half is cryptographically enforced.$document->encrypt( userPassword: 'open-sesame', ownerPassword: 'full-rights-key', mode: EncryptionMode::Aes256, // Permissions are a declared request to a cooperating reader, // recorded inside the encrypted document — not a hard lock. permissions: Permission::Print->value | Permission::CopyContent->value,);
$document->save('offer.pdf');사용자 비밀번호와 소유자 비밀번호는 서로 다른 일을 하는 서로 다른 키입니다.
permissions 인자는 잘 행동하는 리더가 허용해야 할 것을 명시합니다. 그것은
정직한 메타데이터이며, 변조가 탐지되도록 보안 핸들러에 의해 무결성이 보호됩니다 — 그리고
그것이 생산하는 라이브러리가 약속할 수 있는 것의 천장입니다.
흔한 오해
섹션 제목: “흔한 오해”함정은 “권한”을 “강제”로 읽는 것입니다. 그것은 직관적입니다. 플래그가 인쇄 허용 안 됨이라고 말하니, 분명히 인쇄가 막힐 것입니다. 하지만 PDF 안의 어떤 것도 손을 뻗어 리더의 인쇄 버튼을 비활성화할 수 없습니다. 권한 정수는 협조하는 리더가 따르도록 기록된 것입니다. 협조하지 않기로 선택하는 리더는 — 그리고 여럿이 그렇습니다 — 자유롭게 인쇄하고, 복사하고, 편집할 수 있습니다.
NextPDF는 이 점에 의도적입니다. 코어 암호화 경로는 권한 플래그를 선언된 의도로 취급하며 결코 그것을 강제하는 척하지 않습니다. 행위가 진정으로 방지되기를 원한다면, 그 통제는 파일 바깥에 — 여러분이 그 문서를 누구에게 주느냐에, 또는 그것을 둘러싼 접근 제어 시스템에 — 살아 있어야 합니다.
한계와 경계
섹션 제목: “한계와 경계”각 절반이 무엇을 보장하는지에 대해 정밀해야 합니다. 암호화(사용자 비밀번호 계층)는 진짜 기밀성 통제입니다. 비밀번호가 강하면 강하고, 여러분이 고르는 비밀만큼만 강합니다. 권한(소유자 비밀번호 계층)은 변조 증거를 남기는 메타데이터이지, 접근 제어가 아닙니다.
| 여러분이 기대할 법한 것 | 암호화가 실제로 제공하는 것 |
|---|---|
| 비밀번호 없이는 누구도 콘텐츠를 읽을 수 없다 | 참입니다. AES-256과 강한 사용자 비밀번호가 있으면, 문자열과 스트림은 키 없이는 읽을 수 없습니다. 진짜로 강제됩니다. |
| 누구도 “복사 금지”를 “복사 허용”으로 다시 쓸 수 없다 | 불가능한 것이 아니라 변조 증거를 남기는 것입니다. 권한 플래그는 표준 보안 핸들러에 의해 무결성이 보호됩니다. 외부인이 바이트를 편집할 수는 있지만, 변경된 사본은 검증되지 않으므로 적합한 리더가 그 변경을 탐지하고 거부합니다. |
| 리더가 복사나 인쇄를 하지 못하게 막힐 것이다 | 어떤 PDF 생산자도 보장하지 않습니다. 협조하지 않는 리더는 플래그를 무시할 수 있습니다. 이것은 NextPDF의 한계가 아니라 포맷의 속성입니다. |
또 두 가지 경계를 분명히 말해 둘 가치가 있습니다. 첫째, 암호화는
문서의 구조가 아니라 콘텐츠를 보호합니다. 객체 레이아웃과 페이지 수는 여전히
보이며, 이는 리더가 암호화 딕셔너리를 찾기 위해 정상이고 필요합니다. 둘째, 암호화된
PDF는 보관용 PDF/A 적합성을 동시에 주장할 수 없습니다 — 그 프로파일은 Encrypt
항목을 금지하므로, 둘 중 하나를 선택하게 됩니다.
암호화 및 권한 문제 해결 페이지가
구체적인 예외와 PDF/A 거부를 자세히 다룹니다.
관련 문서
섹션 제목: “관련 문서”- 표준 지형 — ISO 32000-2와 그 암호화 절이 PDF 표준 사이에서 어디에 자리하는지.
- 암호화 및 권한 플래그 — 실무적 항목들: 복호화 실패, 그리고 코드에서의 권한 경계.
- PDF의 실체 — 암호화가 보호하는 객체 모델, 그리고 그것이 보이는 채로 남겨 두는 구조.
- PDF 안에서 서명이 자리 잡는 방식 — 문서 신뢰의 다른 절반: 암호화는 숨기고, 서명은 증명합니다.
용어집
섹션 제목: “용어집”- AES-256 — 256비트 키를 가진 고급 암호화 표준(Advanced Encryption Standard)으로, PDF 콘텐츠 암호화를 위한 권장되는 현대 암호.
- 사용자 비밀번호(열기 비밀번호) — 암호화된 문서를 열고 읽는 데 필요한 비밀. 그것이 없으면, 콘텐츠를 복호화할 수 없습니다.
- 소유자 비밀번호(권한 비밀번호) — 권한 플래그를 다스리는 “완전한 권리” 비밀. 문서는 열기 위해 사용자 비밀번호를 요구하지 않으면서도 이것을 가질 수 있습니다.
- 권한 플래그 — 암호화 딕셔너리에 저장된, 선언된 인쇄/복사/수정 의도. 변조가 탐지되도록 무결성이 보호되지만, 협조하는 리더에 의해서만 따라집니다.
- 보안 핸들러 — 비밀번호로부터 파일 암호화 키를 도출하는 구성 요소로, ISO 32000-2의 표준 보안 핸들러에 정의되어 있습니다.
- 리더 협조적(reader-cooperative) — 파일 자체에 의해 강제되는 것이 아니라, 소비하는 소프트웨어가 따르기로 선택하는 데 달린 통제.