2016-02-03 1 views
0

Я разрабатываю WebService были клиент может подписать PDF, это шаги:iTextSharp - Подпись Hash

  1. Client выберите PDF подписать
  2. веб-службы Извлечение хэш из PDF и отправить его к внешнему поставщику
  3. внешнему поставщику подписать хэш
  4. внешний поставщик отправляет обратно подписанный Hash
  5. веб-службы включают подписанный хэш обратно в PDF
  6. У клиента есть подписанный PDF

У меня возникла большая проблема с вставкой/обновлением подписанного хэша в формате pdf.

Я использую iTextSharp.

Я уже прочитал белую бумагу «Цифровые подписи для документов PDF» от Бруно Лоуджи, и это была большая помощь, но я не могу понять, как вставить подписанный хеш, который, кстати, это единственное, что у меня есть, никаких сертификатов, o ничего.

Пожалуйста, помогите.

Габриэль

+1

Вы сохранили оригинальные 'PdfStamper' и' SignatureAppearanc é'? Без, по крайней мере, ключевых частей вашего кода, вам сложно помочь. – mkl

+0

Это то, что провайдер запрашивает только хэш. Нет подписи Внешний вид, ничего. В основном я извлекаю хэш файла PDF так. [КОД] частная строка FileHash (байт [] vGblFilePDF) { \t использованием (SHA1CryptoServiceProvider SHA1 = новый SHA1CryptoServiceProvider()) { \t \t \t vGblHash = Convert.ToBase64String (sha1.ComputeHash (vGblFilePDF)); \t} \t return vGblHash; } [/ CODE] Затем я отправляю его провайдеру, получив WS, добавив только идентификационный номер, затем поставщик отправит мне обратно (после идентификации) подписанный хеш, который мне нужно вставить в pdf. Я знаю, что чего-то не хватает. С уважением. – Gabriel

ответ

0

Согласно Ваш комментарий Ваш текущий подход заключается в следующем:

В основном я извлечь хэш файла в формате PDF, как это.

private string FileHash(byte[] vGblFilePDF) 
{ 
    using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
    { 
     vGblHash = Convert.ToBase64String(sha1.ComputeHash(vGblFilePDF)); 
    } 
    return vGblHash; 
} 

тогда я отправить его на поставщика trought WS, добавив только идентификационный номер, то провайдер отправить меня обратно (после идентификации) подписанный хэш, которым я должен вставить в PDF.

Этот подход в корне неверен, вы уже начинаете с вычисления неправильного хэша!

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

Basic structure of a signed PDF

(Для некоторых слоев и указателей на дополнительные литературе см. this answer)

После этого полномасштабной PKCS # 7/CMS с подписями для этого хеша документа должен быть создан и вставлен в этот зарезервированный раздел.

Это то, что большая часть кода подписи IText (здесь, в Java) делает для вас:

PdfReader reader = new PdfReader(src); 
FileOutputStream os = new FileOutputStream(dest); 
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
// Creating the appearance 
PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
appearance.setReason(reason); 
appearance.setLocation(location); 
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
// Creating the signature 
ExternalDigest digest = new BouncyCastleDigest(); 
ExternalSignature signature = ...; 
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); 

(взято из C2_01_SignHelloWorld.java эквивалентно C2_01_SignHelloWorld.cs)

Вы просто должны предоставить ExternalSignature/IExternalSignature реализация связи с вашим провайдером:

public interface IExternalSignature { 

    /** 
    * Returns the hash algorithm. 
    * @return the hash algorithm (e.g. "SHA-1", "SHA-256,...") 
    */ 
    String GetHashAlgorithm(); 

    /** 
    * Returns the encryption algorithm used for signing. 
    * @return the encryption algorithm ("RSA" or "DSA") 
    */ 
    String GetEncryptionAlgorithm(); 

    /** 
    * Signs it using the encryption algorithm in combination with 
    * the digest algorithm. 
    * @param message the message you want to be hashed and signed 
    * @return a signed message digest 
    * @throws GeneralSecurityException 
    */ 
    byte[] Sign(byte[] message); 
} 
+0

Большое спасибо за ваш ответ. И если я правильно понимаю строку ExternalSignature signature = ...; будет подписанный хеш. Но в строке MakeSignature.signDetached (внешний вид, дайджест, подпись, цепочка, нуль, нуль, нуль, 0, субфильтр); мне нужен сертификат (цепочечная переменная), которого у меня нет. Лучший пример - пример на страницах 116 - 120 из Белой книги IText, но я пропущу некоторые данные (уже разговариваю с моим провайдером). Большое спасибо за вашу помощь!! – Gabriel

+0

Вам понадобится сертификат в любом случае, как здесь явно или неявно, используя поставщик сигнатуры, который отправляет обратно полный контейнер подписи PKCS # 7/CMS, который уже включает сертификат подписывающего лица. Сертификат после всего указывает личность подписывающего ... – mkl

+0

«* И если я правильно понимаю, строка' ExternalSignature signature = ...; 'будет подписанным хешем. *" - Не совсем ... это будет экземпляр класса с методом 'byte [] Sign (byte [] message);' который (при вызове) возвращает байты подписи для хэша. – mkl

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

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