Добавление подписи сертификации / DocMDP с использованием OpenPDF

#pdf #pdf-generation #openpdf #pdf-specification

Вопрос:

Я просто наткнулся на следующий код в OpenPDF при создании DocMDP:

 private void addDocMDP(PdfDictionary crypto) {
    PdfDictionary reference = new PdfDictionary();
    PdfDictionary transformParams = new PdfDictionary();
    transformParams.put(PdfName.P, new PdfNumber(certificationLevel));
    transformParams.put(PdfName.V, new PdfName("1.2"));
    transformParams.put(PdfName.TYPE, PdfName.TRANSFORMPARAMS);
    reference.put(PdfName.TRANSFORMMETHOD, PdfName.DOCMDP);
    reference.put(PdfName.TYPE, PdfName.SIGREF);
    reference.put(PdfName.TRANSFORMPARAMS, transformParams);
    reference.put(new PdfName("DigestValue"), new PdfString("aa"));
    PdfArray loc = new PdfArray();
    loc.add(new PdfNumber(0));
    loc.add(new PdfNumber(0));
    reference.put(new PdfName("DigestLocation"), loc);
    reference.put(new PdfName("DigestMethod"), new PdfName("MD5"));
    reference.put(PdfName.DATA, writer.reader.getTrailer().get(PdfName.ROOT));
    PdfArray types = new PdfArray();
    types.add(reference);
    crypto.put(PdfName.REFERENCE, types);
  }
 

Это также будет помещено в PDF-файл:

 /Reference[<</DigestLocation[0 0] /TransformMethod/DocMDP /Type/SigRef /DigestMethod/MD5  
/DigestValue(aa) /TransformParams<</P 1/V/1.2/Type/TransformParams>>/Data 5 0 R>>]
 

Я изменил метод переваривания на что-то более новое, и это просто сработало. Кроме того, » аа » выглядит довольно статично и, честно говоря, похоже на фиктивную реализацию.
Есть какие-нибудь идеи о том, что это за ценности? И почему они могут быть изменены без последствий?
Я сравнил его с его предшественником *текст 5, но там то же самое…

Ответ №1:

Ваш вопрос, по сути, касается не OpenPDF в частности, а определенных значений в словаре преобразования DocMDP. Таким образом, мой ответ не будет сосредоточен на OpenPDF.

В версиях PDF 1.5 и 1.6 в дополнение к дайджестам диапазона байтов в сигнатурах с помощью методов преобразования использовались так называемые дайджесты объектов. Эти дайджесты были рассчитаны рекурсивно по определенному набору объектов PDF в зависимости от типа и параметров рассматриваемого преобразования.

Значение метода дайджеста-это алгоритм хэширования, используемый в дайджестах объектов.

В справочнике Adobe по PDF 1.7 дайджесты объектов были устаревшими, что было действительно ясно из ошибок:

Снимок экрана с ошибками

В ISO 32000-1 дайджесты объектов были полностью удалены из текста (в некоторых случаях оставляя текст, который трудно понять).

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

Вы также найдете причину, по которой iText использует фиктивные значения в тех же ошибках:

скриншот

Таким образом, Adobe Acrobat 7 и 8 требовали наличия некоторых значений. В настоящее время в них больше нет необходимости.


В этом контексте вас может заинтересовать выпуск 117 в формате PDF — метод дайджеста ошибочно стал обязательным в стандарте ISO 32000-2:2020, и этот вопрос касается его устаревания.

Комментарии:

1. OpenPDF был отправной или пусковой точкой моего вопроса, и у меня была эта реализация под рукой, поэтому я упомянул OpenPDF. Но я также увидел независимость, и именно поэтому я также добавил тег #PDF-Спецификация. В остальном, как всегда, точно 😉 (Я всегда забываю об этих документах с ошибками) спасибо

2. ах, и ваш собственный ответ теперь закрывает цикл обратно в OpenPDF… 😉

Ответ №2:

Поэтому в OpenPDF мы могли бы адаптировать метод следующим образом:

 private void addDocMDP(PdfDictionary crypto) {
    PdfDictionary reference = new PdfDictionary();
    PdfDictionary transformParams = new PdfDictionary();
    transformParams.put(PdfName.P, new PdfNumber(certificationLevel));
    transformParams.put(PdfName.V, new PdfName("1.2"));
    transformParams.put(PdfName.TYPE, PdfName.TRANSFORMPARAMS);
    reference.put(PdfName.TRANSFORMMETHOD, PdfName.DOCMDP);
    reference.put(PdfName.TYPE, PdfName.SIGREF);
    reference.put(PdfName.TRANSFORMPARAMS, transformParams);
    reference.put(PdfName.DATA, writer.reader.getTrailer().get(PdfName.ROOT));
    PdfArray types = new PdfArray();
    types.add(reference);
    crypto.put(PdfName.REFERENCE, types);
}
 

Я попробовал и протестировал его, и нет никаких жалоб от *dobe reader…