使用C#代码验证和获取PDF中的数字签名

 更新时间:2025年11月21日 08:57:09   作者:2501_93070778  
使用数字签名保护 PDF 对于确保文档的完整性和不可否认性至关重要,在此背景下,能够验证数字签名同样重要,本文将向您介绍如何在 C# 中使用 Spire.PDF for .NET 验证或获取 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();
        }
    }
}

到此这篇关于使用C#代码验证和获取PDF中的数字签名的文章就介绍到这了,更多相关C#验证和获取PDF数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在C#中如何使用ResNet50v2进行图像识别

    在C#中如何使用ResNet50v2进行图像识别

    ONNX 运行时推理可以实现更快的客户体验和更低的成本,支持来自深度学习框架如 PyTorch和TensorFlow/Keras以及经典机器学习库如 scikit-learn、LightGBM、XGBoost 等的模型,这篇文章主要介绍了在C#中如何使用ResNet50v2进行图像识别,需要的朋友可以参考下
    2024-07-07
  • C#编写Windows服务实例代码

    C#编写Windows服务实例代码

    本篇文章主要介绍使用Microsoft Visual Studio2012可以很方便的创建一个Windows服务,本例实现一个向D盘的txt文件里,写入系统时间的Windows服务
    2013-10-10
  • C#实现的Socket服务器端、客户端代码分享

    C#实现的Socket服务器端、客户端代码分享

    这篇文章主要介绍了C#实现的Socket服务器端、客户端代码分享,2个非常简单的入门例子,需要的朋友可以参考下
    2014-08-08
  • C# WinForm创建Excel文件的实例

    C# WinForm创建Excel文件的实例

    下面小编就为大家带来一篇C# WinForm创建Excel文件的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#中实现在32位、64位系统下自动切换不同的SQLite dll文件

    C#中实现在32位、64位系统下自动切换不同的SQLite dll文件

    这篇文章主要介绍了C#中实现在32位、64位系统下自动切换不同的SQLite dll文件,本文使用C#代码实现DLL文件的切换,需要的朋友可以参考下
    2014-09-09
  • C#创建dll类库的图文步骤

    C#创建dll类库的图文步骤

    类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它。这样一来,就节省了我们的内存空间,需要的朋友可以参考下
    2017-01-01
  • C#集合根据对象的某个属性进行去重的代码示例

    C#集合根据对象的某个属性进行去重的代码示例

    当根据对象的Name属性进行去重时,你可以使用以下三种方法:使用Distinct方法和自定义比较器、使用LINQ的GroupBy方法,以及使用HashSet,下面给大家介绍C#集合根据对象的某个属性进行去重的代码示例,感兴趣的朋友一起看看吧
    2024-03-03
  • 详解如何使用BenchmarkDotNet对.NET代码进行性能基准测试

    详解如何使用BenchmarkDotNet对.NET代码进行性能基准测试

    BenchmarkDotNet是一个基于.NET开源、功能全面、易于使用的性能基准测试框架,这篇文章就来和小编一起学习一下如何使用BenchmarkDotNet对.NET代码进行性能基准测试吧
    2024-12-12
  • C# Struct的内存布局问题解答

    C# Struct的内存布局问题解答

    这篇文章介绍了C# Struct的内存布局问题解答,有需要的朋友可以参考一下
    2013-11-11
  • C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    下面小编就为大家带来一篇C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证。小编觉得挺不错的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧
    2016-03-03

最新评论