Обнаружить изменения PDF с помощью подписей

Я разрабатываю веб-приложение, которое позволяет пользователям загружать PDF-файл, который они должны подписать с помощью Adobe Acrobat, используя свой сертификат, а затем загружать обратно в Интернет.

я использую C# а также itextsharp 5.5.9.0 для всей работы, связанной с PDF.

Теперь мне нужно убедиться, что документ не был изменен после его загрузки из Интернета. Я пытался сделать это, добавив свою собственную подпись в файл PDF, прежде чем позволить пользователям загрузить его (подпись реализована более или менее как в этом вопросе). Подписание и проверка работают нормально, пока файл не будет подписан во второй раз (с сертификатом пользователя).

После этого первая подпись как-то становится недействительной, я проверил обе itextsharp"s AcroFields.SignatureCoversWholeDocument метод (возвращает false) и в пользовательском интерфейсе Adobe Acrobat ( скриншот).

Итак, у меня есть 2 вопроса:

  1. Можно ли вообще проверить, был ли документ изменен между двумя подписями?
  2. Если нет - какой альтернативный способ программно (используя itextsharp) проверить, был ли файл PDF изменен после того, как он был сгенерирован и до того, как был подписан?

1 ответ

Решение

Подписание и проверка работают нормально, пока файл не будет подписан во второй раз (с сертификатом пользователя). После этого первая подпись как-то становится недействительной

Как уже пояснялось в комментариях, если кто-то хочет, чтобы первая подпись оставалась действительной, вторая должна применяться в режиме добавления (iText lingo) / в качестве инкрементного обновления (языковой стандарт PDF). Иначе подписанные байты очень вероятно изменятся, и подписанное значение хеша больше не будет совпадать.

  1. Можно ли вообще проверить, был ли документ изменен между двумя подписями?

Точнее, ваш вопрос должен заключаться в том, можно ли проверить, превышают ли изменения документа между двумя сигнатурами те изменения, которые вероятны для встраивания второй сигнатуры.

Короче говоря: это возможно в вашем случае использования, но все еще подразумевает некоторую работу и жонглирование с помощью низкоуровневых API iText. В деталях:

В общем, это не тривиально, потому что добавление новой подписи с визуализацией правдоподобно

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

Таким образом, нетривиально проверить, относятся ли изменения к какой-либо из этих категорий или нет.

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

Но вы говорите, ваши пользователи

нужно подписать с Adobe Acrobat

Это может сделать вашу задачу несколько выполнимой: если вы используете Adobe Acrobat для добавления образцов подписей к ряду документов, которые вы подписали раньше, вы можете проанализировать, что Adobe Acrobat обычно изменяется в документах при их подписании.

Используя эти знания, вы можете реализовать класс, который проверяет, присутствуют ли только эти изменения.

  1. Если нет - каков альтернативный способ программно (используя itextsharp) проверить, был ли файл PDF изменен после того, как он был сгенерирован и до того, как он был подписан?

Без применения первой подписи ситуация становится намного сложнее, поскольку у программного обеспечения для подписи PDF пользователя нет причин ограничивать изменения внутренней структуры документа, если они не влияют на его внешний вид. Поэтому я бы попробовал работать с двойными подписями.

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

Рендеринг еще не является особенностью iText, но инфраструктура синтаксического анализа тем временем развивается достаточно далеко, чтобы служить основой для функции рендеринга.


Применение первой подписи может даже помочь предотвратить случайные изменения: если вы предоставляете пустое поле подписи для пользователя и используете подпись сертификации самостоятельно, вы можете ограничить "разрешенные изменения" чуть больше, чем заполнением этого пустого поля подписи, и Adobe Acrobat обычно соблюдает такие ограничения, если явно не указано иное.


Информацию о фонах для встроенных подписей в PDF можно найти в этом ответе на Информационном стеке Exchange.

Другие вопросы по тегам