使用數字簽名保護 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();
}
}
}