簡體   English   中英

如何使用iText驗證自定義格式的數字簽名?

[英]How to verify a custom formatted digital signature with iText?

我現在正在編寫一個pdf查看器,可以使用它將自定義格式的簽名(使用中文SM2加密算法,這就是為什么我不能使用標准驗證方法,這就是為什么我必須編寫自己的pdf查看器)的原因。簽名部分,計算哈希,然后用usbkey簽名哈希,最后將簽名放入pdf。 但是檢查部分,我找不到任何幫助,我也不知道該怎么辦。我需要找到一種方法來獲取原始字節范圍並計算哈希值,然后從簽名表單字段讀取簽名。並將散列與舊散列進行比較,以確定文件是否已更改。有人可以給我一些示例代碼嗎?

這是我找到的一些Java代碼,並將其重寫為c#,盡管有些方法並不有效,但我認為這可能會有所幫助。

  PdfReader pdfReader = new PdfReader("D:\\Hello_world.pdf");
  PdfDocument pdfDocument = new PdfDocument(pdfReader);
  {
       SignatureUtil signatureUtil = new SignatureUtil(pdfDocument);
       foreach (String name in signatureUtil.GetSignatureNames())
        {

            PdfSignature signature = signatureUtil.getSignature(name);
            PdfArray b = signature.GetByteRange();
            RandomAccessFileOrArray rf = pdfReader.GetSafeFile();
            Stream rg = new RASInputStream(new RandomAccessSourceFactory().CreateRanged(rf.CreateSourceView(), SignatureUtil.AsLongArray(b)));
            Stream result = TARGET_STREAM_FOR_name_BYTES;
            {
                 byte[] buf = new byte[8192];
                 int rd;
                 while ((rd = rg.Read(buf, 0, buf.Length)) > 0)
                 {
                      result.Write(buf, 0, rd);
                  }
             }

          }
    }

要確定文件在簽名后是否已更改,可以將SignatureUtl#verifySignaturePdfPKCS7#verify一起使用。

讓我們看一下iText的官方示例之一,以了解如何實現(它是用Java編寫的,但由於api完全相同,因此將其移植到C#應該沒有問題): https:// github.com/itext/i7js-signatures/blob/develop/src/test/java/com/itextpdf/samples/signatures/chapter05/C5_01_SignatureIntegrity.java

更准確地說,您對下一個片段感興趣:

 public PdfPKCS7 verifySignature(SignatureUtil signUtil, String name) throws GeneralSecurityException, IOException {
    System.out.println("Signature covers whole document: " + signUtil.signatureCoversWholeDocument(name));
    System.out.println("Document revision: " + signUtil.getRevision(name) + " of " + signUtil.getTotalRevisions());
    PdfPKCS7 pkcs7 = signUtil.verifySignature(name);
    System.out.println("Integrity check OK? " + pkcs7.verify());
    return pkcs7;
}

請注意, SignatureUtil#verifySignature實際上並不檢查簽名的完整性,而只是檢查其某些屬性。 其主要目的是創建一個PdfPKCS7對象,該對象隨后可用於通過PdfPKCS7#verify檢查簽名的完整性。

重要的是要提到上述方法不會檢查用於簽署文檔的證書是否有效。 應該對它們(如有必要)進行單獨檢查。

通常,我建議您閱讀iText簽名功能的概述 (本書是免費的)。 盡管這本書是為iText5編寫的,但可以在iText的github頁面上找到完全移植的iText7示例: https : //github.com/itext/i7js-signatures

PS:由於您沒有告訴我們使用哪個iText版本,因此我在最近的版本中給了您一個答案:iText7。 但是,由於簽名功能剛剛從iText5移植到iText7,因此很容易在iText5中重現答案。 只需研究相同的示例存儲庫: Java 1C#1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM