Как на самом деле работает шифрование 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. Модель точна: обработчик безопасности выводит ключ шифрования файла из пароля, строки и потоки документа шифруются этим ключом, а словарь шифрования — на который ссылается трейлер файла — записывает, какой шифр использовался, какой длины ключ и какие разрешения автор объявил.
Современный рекомендуемый шифр — это AES с 256-битным ключом. Когда вы шифруете 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 — Advanced Encryption Standard с 256-битным ключом, рекомендуемый современный шифр для шифрования содержимого PDF.
- Пользовательский пароль (пароль открытия) — секрет, требуемый для открытия и чтения зашифрованного документа. Без него содержимое нельзя дешифровать.
- Пароль владельца (пароль разрешений) — секрет «полных прав», который управляет флагами разрешений. Документ может иметь его, не требуя пользовательского пароля для открытия.
- Флаги разрешений — объявленное намерение печати/копирования/изменения, хранящееся в словаре шифрования. Защищены по целостности, так что вмешательство обнаруживается, но соблюдаются лишь сотрудничающей программой чтения.
- Обработчик безопасности — компонент, который выводит ключ шифрования файла из пароля, определённый стандартным обработчиком безопасности в ISO 32000-2.
- Сотрудничество с программой чтения (reader-cooperative) — контроль, который зависит от того, что потребляющее ПО выбирает ему подчиниться, а не обеспечивается самим файлом.