博客 / 詳情

返回

如何使用C#代碼驗證或獲取 PDF 中的數字簽名

使用數字簽名保護 PDF 對於確保文檔的完整性和不可否認性至關重要。在此背景下,能夠驗證數字簽名同樣重要。有效的簽名意味着文檔自簽名以來未被篡改,並且確實來自所聲明的來源。

在處理數字簽名時,有時您可能還希望獲取簽名的證書,以瞭解其頒發者信息、主題信息、序列號及有效期等。本文將向您介紹如何在 C# 中使用 Spire.PDF for .NET 驗證或獲取 PDF 中的數字簽名。

安裝 Spire.PDF for .NET

首先,您需要將 Spire.PDF for .NET 包中包含的 DLL 文件添加為 .NET 項目的引用。這些 DLL 文件可以通過此鏈接下載,或者通過 NuGet 進行安裝。

PM> Install-Package Spire.PDF

使用 C# 驗證 PDF 中的數字簽名

Spire.PDF for .NET 提供了 PdfSignature.VerifySignature() 方法,可直接檢查 PDF 文檔中數字簽名的有效性。

示例代碼如下:

using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

namespace GetSignatureCertificate
{
    class Program
    {
        static void Main(string[] args)
        {

            //創建 PdfDocument 對象
            PdfDocument pdf = new PdfDocument();

            //加載 PDF 文件
            pdf.LoadFromFile("PDFSignature.pdf");

            //獲取 PDF 文件中的表單字段集合
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            //遍歷所有字段
            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //獲取簽名字段
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    //獲取簽名
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //驗證簽名
                    bool valid = signature.VerifySignature();
                    if (valid)
                    {
                        Console.WriteLine("Valid signatures");
                    }
                    else
                    {
                        Console.WriteLine("Invalid signatures");
                    }
                }
            }
        }
    }
}

使用 C# 檢測已簽名的 PDF 是否被修改

要驗證 PDF 文檔在簽名後是否被修改,可以使用 PdfSignature.VerifyDocModified() 方法。如果結果顯示文檔已被篡改,則説明簽名將失效,文檔的完整性將受到破壞。

示例代碼如下:

using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

namespace GetSignatureCertificate
{
    class Program
    {
        static void Main(string[] args)
        {

            //創建 PdfDocument 對象
            PdfDocument pdf = new PdfDocument();

            //加載 PDF 文檔
            pdf.LoadFromFile("PDFSignature.pdf");

            //獲取 PDF 文件中的表單字段集合
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //獲取簽名字段
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    //獲取簽名
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //檢查文檔在簽名後是否被修改
                    bool modified = signature.VerifyDocModified();
                    if (modified)
                    {
                        Console.WriteLine("文檔已被修改。");
                    }
                    else
                    {
                        Console.WriteLine("文檔未被修改。");
                    }
                }
            }
        }
    }
}

使用 C# 獲取 PDF 中數字簽名的證書

用於簽署 PDF 文件的數字證書通常包含多種信息,用於驗證頒發者的身份。使用 Spire.PDF for .NET,您可以通過 PdfSignatureFieldWidget.Signature.Certificate 屬性獲取 PDF 文件中的證書。

示例代碼如下:

using Spire.Pdf;
using Spire.Pdf.Widget;

namespace GetSignatureCertificate
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建 PdfDocument 對象
            PdfDocument pdf = new PdfDocument();

            //加載 PDF 文件
            pdf.LoadFromFile("PDFSignature.pdf");

            //獲取 PDF 文件中的表單字段集合
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            //遍歷所有字段
            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //獲取簽名字段
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    //獲取簽名的證書
                    string certificateInfo = signatureFieldWidget.Signature.Certificate.ToString();

                    //獲取證書的格式
                    string format = signatureFieldWidget.Signature.Certificate.GetFormat();

                    //輸出證書信息
                    Console.WriteLine(certificateInfo + "\n" + "[CertificateFormat]\n " + format);
                }
            }
            Console.ReadKey();
        }
    }
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.