Шифрование и расшифровка PDF в Python
Важно: приведённый код сохраняет файлы локально и запрашивает пароль через ввод в консоли. Для продакшн‑решений используйте безопасное управление ключами и учёт доступа.
Неавторизованный доступ к чувствительным файлам — частая проблема. Чтобы гарантировать, что доступ к содержимому имеют только уполномоченные, можно зашифровать файлы до передачи.
В этой статье показано, как зашифровать PDF с помощью Python и PyMuPDF и как затем расшифровать его обратно.
Ключевые понятия
- PyMuPDF (fitz): библиотека для работы с PDF и другими форматами; кратко — инструмент для открытия, редактирования и сохранения PDF.
- AES-256: симметричный алгоритм шифрования, который используется в примерах (один из доступных алгоритмов в fitz).
Установка окружения
Требуется базовое знание Python. В терминале macOS или командной строке Windows выполните:
pip install PyMuPDFЭта библиотека поможет открывать и манипулировать PDF.
После установки PyMuPDF можно переходить к коду. Полный исходный код доступен в репозитории на GitHub (ссылка в исходном материале).
Импорт модуля fitz
Импортируйте модуль fitz из PyMuPDF:
import fitz
fitz используется для открытия, шифрования, расшифровки и сохранения PDF.
Проверка, зашифрован ли PDF
Создайте функцию, возвращающую булево значение — зашифрован ли файл:
def pdf_is_encrypted(file):
pdf = fitz.Document(file)
return pdf.isEncryptedЭта функция пригодится для автоматического решения — шифровать файл или расшифровывать.
Шифрование PDF
Функция шифрования проверяет, не зашифрован ли уже файл, и если нет — применяет AES-256 и сохраняет зашифрованную версию.
def encrypt_pdf_file(pdf, password, outfile, file):
if not pdf_is_encrypted(file):
perm = int(
# Ensure everyone with the PDF
# can access it
fitz.PDF_PERM_ACCESSIBILITY
| fitz.PDF_PERM_PRINT # permits printing
| fitz.PDF_PERM_COPY # permits copying
| fitz.PDF_PERM_ANNOTATE # permits annotations
)
# eEncryption algorithm
encrypt_meth = fitz.PDF_ENCRYPT_AES_256
pdf.save(outfile, encryption=encrypt_meth, user_pw=password,
permissions=perm)
if pdf.save:
print("PDF encrypted")Эта функция сохраняет зашифрованный PDF в путь, указанный в параметре outfile.
Расшифровка зашифрованного PDF
Функция расшифровки сначала проверяет, зашифрован ли файл, затем запрашивает пароль и пытается открыть PDF. Если пароль верный, содержимое сохраняется в новый незашифрованный файл.
def decrypt_pdf(file):
if pdf_is_encrypted(file):
password = input('Enter pdf password : ')
pdf = fitz.open(file)
if pdf.authenticate(password):
pdf.save('decrypted.pdf')
if pdf.save:
print("PDF decrypted")
else:
print('Incorrect Password')Код сохранит незашифрованный PDF в текущую рабочую директорию как decrypted.pdf.
В примере защищённый файл protected.pdf был расшифрован и сохранён как decrypted.pdf.
Управление потоком программы
Главная функция контролирует последовательность: путь к входному PDF, вызов функций шифрования и расшифровки и передача параметров.
def main():
# replace the file path with either that of
# the pdf to be encrypted or decrypted
file = 'sample.pdf'
pdf = fitz.open(file)
password = 'pass123'
encrypt_pdf_file(pdf, password, 'protected.pdf', file)
decrypt_pdf(pdf)
Чтобы изменить имя зашифрованного файла, замените “protected.pdf” на своё, сохранив расширение “.pdf”.
Запуск основного метода
Убедитесь, что main() запускается только при непосредственном запуске скрипта:
if __name__ == '__main__':
main()Этот фрагмент проверяет, выполняется ли скрипт как основная программа, и вызывает main.
Полезные рекомендации и варианты использования
Когда это работает хорошо
- Локальная защита документов перед отправкой по электронной почте.
- Добавление базовой защиты для внутренних отчётов и форм.
Когда это может не подойти
- Если требуется управление доступом на уровне пользователей и аудит: шифрование файла + пароль недостаточно, нужна система управления правами (DRM, сервер авторизации).
- Если нужно централизованное хранение и ротация ключей: используйте KMS (Key Management Service).
Альтернативные библиотеки и подходы
- PyPDF2 — часто используемая библиотека, поддерживает базовое шифрование/расшифровку.
- pikepdf — обёртка над QPDF, подходит для продакшн‑операций и сложных трансформаций.
- Использовать контейнеры (например, зашифрованный ZIP с AES) при переносе нескольких файлов.
Эвристики и ментальные модели
- Если вам нужна совместимость со старыми ридерами PDF — тестируйте на целевых клиентах (Adobe Reader, мобильные читалки).
- Считайте пароль секретом первой категории; хранение в коде (как в примере) допустимо только для тестов.
Роли и чек‑листы
- Разработчик: проверить шифрование/расшифровку локально, покрыть тестами.
- Системный администратор: обеспечить безопасное хранилище паролей/ключей (KMS, HashiCorp Vault).
- Конечный пользователь: получать инструкции по вводу пароля и по безопасному хранению файла.
Тесты и критерии приёмки
- Файл sample.pdf был зашифрован и создался protected.pdf.
- protected.pdf нельзя открыть без пароля (проверка на Adobe Reader или другом ридере).
- При вводе правильного пароля создаётся decrypted.pdf идентичный sample.pdf по содержимому.
- При вводе неправильного пароля скрипт сообщает о неверном пароле и не создаёт decrypted.pdf.
Безопасность и жёсткие рекомендации
- Никогда не храните пароли в открытом коде в продакшне.
- Используйте безопасное хранилище секретов (KMS, Vault) и ротацию паролей/ключей.
- Рассмотрите многофакторную авторизацию при доступе к месту хранения зашифрованных файлов.
- Для корпоративных сценариев используйте решения с аудитом доступа и управлением правами.
Быстрый набор команд и сниппеты
- Установка: pip install PyMuPDF
- Открытие файла: pdf = fitz.open(‘file.pdf’)
- Проверка шифрования: pdf.isEncrypted
- Сохранение с шифрованием: pdf.save(‘out.pdf’, encryption=fitz.PDF_ENCRYPT_AES_256, user_pw=’пароль’)
Пример: немедленная расшифровка без интерактивного ввода (не рекомендуется в продакшне):
password = 'pass123'
pdf = fitz.open('protected.pdf')
if pdf.authenticate(password):
pdf.save('decrypted_noninteractive.pdf')Краткий глоссарий
- PDF: формат документа Portable Document Format.
- AES-256: алгоритм симметричного шифрования с ключом 256 бит.
- KMS: служба управления ключами.
Заключение
Шифрование PDF с помощью PyMuPDF — простой способ добавить уровень защиты при передаче и хранении документов. Для тестовых и локальных задач подойдёт приведённый пример. Для боевой эксплуатации следует добавить безопасное хранение паролей, аудит и управление доступом.
Краткие рекомендации:
- Для прототипа: используйте пример как есть, но с вводом пароля в консоли.
- Для продакшна: интегрируйте KMS, ротацию ключей и аудит доступа.
Резюме
- PyMuPDF позволяет быстро шифровать и расшифровывать PDF.
- Пример использует AES-256 и демонстрирует базовый рабочий поток.
- Для реальной безопасности дополните процесс управлением ключей и аудитом.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone