2014-10-08 1 views
1

Я пишу приложение WPF C#, где я вставляю страницу 'header' в качестве первой страницы пакета PDF-документов. Страница заголовка берется с первой страницы первого PDF-файла в пакете.Возврат SHA256 хэша страницы 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» в трейлере содержит разные значения каждый раз. – chazjn

ответ

3

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

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

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

1

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

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

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

1

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

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

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

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

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

0

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

+0

Ага, теперь это звучит очень полезно! Хороший совет. – chazjn

+0

Простое присутствие этого ключа не говорит вам о том, был ли отредактирован PDF-файл. Вероятно, появление первой страницы сильно изменилось. – mkl

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^