Вернуть SHA256 хеш страницы PDF

1

Я пишу приложение С# WPF, где я вставляю страницу 'header' в качестве первой страницы пакета PDF-документов. Страница заголовка берется с первой страницы первого PDF файла в пакете.

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

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

Я выполнил код ниже, чтобы проверить получение хэшей первой страницы в формате pdf, но хэш отличается при каждом запуске.

Почему каждый раз?

благодаря

using System.IO;
using System.Text;
using System.Security.Cryptography;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

namespace Syncada
{
    public class PDFDoc
    {

        private PdfDocument pdfDoc;

        public PDFDoc(string path)
        {
            pdfDoc = PdfReader.Open(path,PdfDocumentOpenMode.Import);
        }

        public string GetPageOneHash()
        {

            byte[] hash;

            PdfPage page = pdfDoc.Pages[0];
            using (MemoryStream stream = new MemoryStream())
            {
                PdfDocument doc = new PdfDocument();
                doc.AddPage(page);
                doc.Save(stream,false);

                SHA256 sha256 = SHA256.Create();
                hash = sha256.ComputeHash(stream);
            }

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }
}
  • 0
    Спасибо всем за ваши ответы. Я вывожу PDF-файл в файл и сравниваю его с шестнадцатеричной программой просмотра, и действительно, «CreationDate» в заголовке и «ID» в трейлере каждый раз содержали разные значения.
Теги:
wpf
pdf
hash
pdfsharp

4 ответа

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

Я выполнил код ниже, чтобы проверить получение хэшей первой страницы в формате pdf, но хэш отличается при каждом запуске.

Почему каждый раз?

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

1

Как уже писал mkl, вы каждый раз создаете новый PDF-документ, поэтому дата и время создания и дата и время изменения будут разными.

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

При использовании DEBUG-сборки PDFsharp файл PDF будет содержать много комментариев. Вы можете использовать любую программу DIFF, чтобы увидеть, что другое.

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

Другой подход: используйте библиотеку, например GhostScript, для создания изображения первой страницы и расчета хэша. Если страница выглядит одинаково, вы получите тот же хеш.

1

Сначала проверьте, удаляется ли поток после его сохранения. Если нет, то вы на самом деле ничего не читаете, так как doc.Save(stream, false) оставляет вас в конце потока.

Для перемотки потока используйте stream.Seek(0, SeekOrigin.Begin); ,

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

0

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

  • 0
    Ах, ха, теперь это звучит очень полезно! Хороший совет.
  • 0
    Простое присутствие этого ключа не говорит вам, был ли PDF отредактирован или нет. Вероятно, внешний вид первой страницы сильно изменился.
Показать ещё 1 комментарий

Ещё вопросы

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