Получить оригинальный контент из подписанного PDF

1

Я хотел бы знать, как получить исходный контент из подписанного PDF-документа, используя библиотеку iText java или другую.

благодаря

ОБНОВЛЕНИЕ 1:

Возможный пример:

PdfReader reader = new PdfReader(PATH_TO_PDF);
AcroFields fields = reader.getAcroFields();
ArrayList<String> signatures = fields.getSignatureNames();
for (String signature : signatures)
{
    // Start revision extraction
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte bb[] = new byte[8192];
    InputStream ip = fields.extractRevision(signature);
    int n = 0;
    while ((n = ip.read(bb)) > 0)
        out.write(bb, 0, n);
    out.close();
    ip.close();
    MessageDigest md = MessageDigest.getInstance("SHA1");
    byte[] resum = md.digest(out.toByteArray());
    // End revision extraction        
}

Примечание 1: В этом примере все признаки достигаются при наличии нескольких знаков.

Примечание 2: Хэш не совпадает с исходным хеш-документом (неподписанным документом)

  • 1
    Этого легко добиться, если подпись была добавлена в режиме добавления. Это невозможно в другом случае.
Теги:
itext
signed

1 ответ

3
Лучший ответ

Пожалуйста, взгляните на следующее изображение:

Изображение 174551

В этом случае у вас есть файл PDF (начиная с %PDF-1. и заканчивая %%EOF), и цифровая подпись является частью самого документа. Это значение ключа /Contents в словаре подписи, которое, в свою очередь, является значением записи /V в словаре поля подписи.

Невозможно получить исходный PDF так, как это было раньше, потому что исходный PDF был изменен: объекты перенумерованы, поле подписи было добавлено или "заполнено", добавив словарь подписи.

Вы можете удалить подпись, но это не даст вам оригинальный PDF файл.

PdfReader reader = new PdfReader(SIGNED); 
AcroFields acroFields = reader.getAcroFields(); 
acroFields.removeField("sig"); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(UNSIGNED)); 
stamper.close(); 
reader.close(); 

В этом случае SIGNED - это путь к файлу с подписями под названием "sig". Мы удаляем полную подпись (включая поле подписи). Путь к результирующему файлу UNSIGNED и файл, в котором больше нет следа поля подписи "sig". Это уже не оригинальный PDF файл, который был подписан.

Теперь посмотрим на следующее изображение:

Изображение 174551

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

Однако вторая и третья подписи были добавлены в режиме добавления. Это единственный способ добавить дополнительные подписи, поскольку изменение версии 1 приведет к поломке первой подписи.

Если у вас есть версия 3 (с пометкой Rev3), очень легко получить ревизию 1 и 3 (Rev1 и Rev2). Это показано в примере подписи:

PdfReader reader = new PdfReader(SIGNED);
AcroFields af = reader.getAcroFields();
FileOutputStream os = new FileOutputStream(REVISION);
byte bb[] = new byte[1028];
InputStream ip = af.extractRevision("first");
int n = 0;
while ((n = ip.read(bb)) > 0)
    os.write(bb, 0, n);
os.close();
ip.close();

В этом примере "first" - это имя поля подписи, SIGNED - это путь к файлу с сигнатурой, а REVISION - это путь к пересмотру, который является результатом этой операции.

  • 0
    Благодарю. Поэтому, если я понял ваше объяснение, невозможно получить исходный контент, поскольку первый знак не добавляется в режиме добавления.
  • 0
    На самом деле, мне действительно нужен хеш оригинального документа, который был подписан. Есть ли способ добиться этого из подписанного документа? Спасибо
Показать ещё 16 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню