PDF / A, подписанный с помощью iText7, позволяет изменять вложенные документы, не нарушая подписи - PullRequest
0 голосов
/ 20 сентября 2018

Я создал PDF / A документ, используя iText7.Созданный документ имеет вложение ().Вложение - это файл .csv.Тогда весь PDF / A был подписан.Я открыл прикрепленный файл .csv и изменил его после того, как подписал его.Я использовал следующий код для проверки подписи:

  public PdfPKCS7 verifySignature(SignatureUtil util, String name) throws GeneralSecurityException, IOException {
    System.out.println("Signature covers whole document: " + util.signatureCoversWholeDocument(name));
    System.out.println("Document revision: " + util.getRevision(name) + " of " + util.getTotalRevisions());
    PdfPKCS7 pkcs7 = util.verifySignature(name);
    System.out.println("Integrity check OK? " + pkcs7.verify());
    return pkcs7;
}

Я ожидал, что проверка целостности вернула ошибку, но я получил:

 Signature covers whole document: false
 Document revision: 1 of 2
 Integrity check OK? true

Это намеренное поведение iText и янеправильно понять намерение подписи?Я ожидаю, что ВЕСЬ документ будет заблокирован для изменений (кроме заполнения форм или аннотаций, если они разрешены).

Как лучше всего подписывать PDF с помощью вложений, если я хочу запретить изменение вложений?

1 Ответ

0 голосов
/ 21 сентября 2018

Чтобы понять, что здесь происходит, вы должны знать, что есть несколько способов сохранить изменения в PDF:

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

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

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

Проверка покрытия (ваш вызов signatureCoversWholeDocument) с другой стороны сообщаетВы, что эта подпись больше не распространяется на весь документ.Таким образом, вы знаете, что изменения были добавлены как инкрементные обновления.

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

Для некоторых фонов по встроенным подписям PDF вы можете прочитать этот ответ и документы, на которые есть ссылки.

Я бы ожидал, что ВЕСЬ документ будет заблокирован для изменений (кроме заполнения форм или аннотаций, если они разрешены).

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

Таким образом, чтобы определить, разрешены ли изменения в PDF или нет, средство проверки должно проанализировать добавления в добавочных обновлениях.

...