Перейти к содержимому
getnextpdf.com

Как на самом деле работает шифрование PDF — и его пределы

Spec: ISO 32000-2, §7.6

Шифрование PDF перемешивает слова и изображения внутри документа так, что лишь тот, у кого есть правильный пароль, может их прочитать. Это настоящая криптография, и она хороша в той единственной задаче, что у неё есть. Её также широко неправильно понимают, потому что та же функция несёт второй механизм — флаги разрешений, — который выглядит как замок и им не является.

Эта страница разделяет эти двое. Она объясняет, что на самом деле защищает AES-256, для чего на самом деле нужны два пароля и где проходит честная граница.

Люди тянутся к шифрованию, когда документ чувствителен: договор, расчётный листок, медицинское письмо. Ожидание разумно — сохрани это в тайне и не давай людям печатать или копировать это. PDF убедительно исполняет первую половину этого желания и вторую половину — лишь на честном слове.

Путаница между этими двумя — вот где приходит цена. Команда помечает файл «без копирования», доверяет, что платформа это обеспечивает, и выпускает. Спустя месяцы кто-то копирует текст за тридцать секунд другой программой чтения, и предположение, которое никогда не держалось, тихо превращается в утечку. Шифрование никогда не было сломано. Его просто попросили сделать то, чего оно не делает.

  • Шифрование защищает конфиденциальность. С AES-256 содержимое строк и потоков PDF — это настоящий шифротекст. Без ключа оно нечитаемо.
  • Пользовательский пароль открывает документ. Предоставьте его — и вы сможете увидеть содержимое. Без него читать нечего.
  • Пароль владельца управляет разрешениями. Это ключ «полных прав». Флаги разрешений, которые он охраняет — печать, копирование, изменение, — записаны внутри зашифрованного документа.
  • Флаги разрешений действуют по принципу сотрудничества с программой чтения. Это просьба к благонамеренной программе чтения, а не принудительное исполнение. Программа чтения, которая их игнорирует, может печатать, копировать или редактировать всё равно.
  • Структура остаётся видимой. Шифрование скрывает содержимое, а не скелет документа — число страниц и схема объектов не являются секретом.

Шифрование PDF определено в Spec: ISO 32000-2, §7.6. Модель точна: обработчик безопасности выводит ключ шифрования файла из пароля, строки и потоки документа шифруются этим ключом, а словарь шифрования — на который ссылается трейлер файла — записывает, какой шифр использовался, какой длины ключ и какие разрешения автор объявил.

Современный рекомендуемый шифр — это AES с 256-битным ключом. Когда вы шифруете PDF этим способом, читаемая полезная нагрузка — текст, который вы бы извлекли, байты изображений, данные шрифтов — преобразуется в шифротекст. Внешняя форма документа остаётся читаемой намеренно: программа чтения должна найти словарь шифрования и узнать длину ключа, прежде чем сможет запросить у вас пароль. Вот почему шифрование лучше всего понимать как конфиденциальность содержимого, а не непрозрачность всего файла.

Два пароля сидят на разных слоях, и это различие — та часть, которую важнее всего понять правильно.

  1. A password is suppliedEither the user password (open) or the owner password (full rights).
  2. The security handler derives the keyISO 32000-2 §7.6.4 turns the password into the file encryption key.
  3. Content is decryptedAES-256 turns the encrypted strings and streams back into readable bytes.
  4. 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.
How a password becomes readable content: the user password (or the owner password) is run through the standard security handler's key-derivation routine to recover the file encryption key, which then decrypts the document's strings and streams. The owner password additionally unlocks the full set of permissions; the user password is bound by whatever permission flags the author declared.

Пользовательский пароль — это пароль открытия. Он отвечает на один вопрос: можно ли вам вообще видеть содержимое? Нет пользовательского пароля — нет читаемого документа; эта часть обеспечивается криптографически, потому что без выведенного ключа дешифровать нечего.

Пароль владельца — это пароль разрешений. Файл может быть открыт кем угодно (без пользовательского пароля) и при этом объявлять пароль владельца, который ограждает действия «полных прав» — печать в высоком разрешении, копирование текста, изменение файла. Критически важно: биты разрешений, которые защищает пароль владельца, защищены по целостности стандартным обработчиком безопасности: вмешательство в них обнаруживается и отвергается соответствующей стандарту программой чтения, потому что обработчик связывает объявленные разрешения с ключами шифрования. Эти биты не являются буквально нечитаемыми или нередактируемыми байтами — атакующий может их изменить, — но изменённая копия не пройдёт проверку, поэтому соответствующая стандарту программа чтения считает её повреждённой. Они свидетельствуют о вмешательстве. Они просто не самообеспечивающие.

Настройки шифрования просто выразить. Важно читать результат честно: это настраивает намерение, и часть этого намерения, касающаяся разрешений, рекомендательна.

<?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.

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