C# 验证PDF数字签名的有效性

数字签名作为PDF文档中的重要安全机制,不仅能够验证文件的来源,还能确保文件内容在传输过程中未被篡改。然而,如何正确验证PDF文件的数字签名,是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签名的有效性 以及验证PDF文档是否被修改

免费.NET PDF库安装:

Free Spire.PDF for .NET 免费库可以通过NuGet直接安装,或者通过以下链接下载产品包解压缩后手动引用dll。

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html

使用C# 验证PDF数字签名有效性

Free Spire.PDF 提供了 PdfSignature 类用于代表PDF文档中的数字签名,要验证签名的有效性可以用该类的 VerifySignature() 方法。

主要步骤:

  1. 创建PdfDocument 对象,并使用 LoadFromFile() 方法加载 PDF 文件。
  2. 获取 PDF 文件中的表单,然后使用获取表单字段集合。
  3. 遍历所有字段,并判断当前字段是否为签名字段(PdfSignatureFieldWidget 类)。
  4. 如果是签名字段,则通过 PdfSignatureFieldWidget.Signature 属性获取该PDF 签名。
  5. 使用 PdfSignature.VerifySignature() 方法检查 PDF 签名的有效性
  6. 输出结果。

C#示例代码:

csharp 复制代码
using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

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

            //加载PDF文档
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("PDF签名.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];

                    //获取PDF签名
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //验证签名有效性
                    bool valid = signature.VerifySignature();
                    if (valid)
                    {
                        Console.WriteLine("有效签名");
                    }
                    else
                    {
                        Console.WriteLine("无效签名");
                    }
                }
            }
        }
    }
}

验证结果:

使用C# 验证PDF文档是否被修改

验证PDF文档是否被修改也能间接验证电子签名的有效性,如果在签名之后文档内容被修改,那么PDF签名也将失效。通过使用 PdfSignature 类提供的 VerifyDocModified() 方法可以快速验证PDF文档的完整性。

主要步骤:

  1. 创建 PdfDocument 对象,并使用 LoadFromFile() 方法加载 PDF 文件
  2. 获取 PDF 文件中的表单,然后使用获取表单字段集合。
  3. 遍历所有字段,并判断当前字段是否为签名字段(PdfSignatureFieldWidget 类)。
  4. 如果是签名字段,则通过 PdfSignatureFieldWidget.Signature 属性获取该PDF 签名。
  5. 使用 PdfSignature.VerifyDocModified() 方法验证签名后文档是否被修改。
  6. 输出结果。

C#示例代码:

csharp 复制代码
using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

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

            //加载PDF文档
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("PDF签名.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];

                    //获取PDF签名
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //验证签名后PDF文档是否被修改
                    bool modified = signature.VerifyDocModified();
                    if (modified)
                    {
                        Console.WriteLine("文档被修改了。");
                    }
                    else
                    {
                        Console.WriteLine("文档未被修改。");
                    }
                }
            }
        }
    }
}

验证结果:

通过这些步骤和示例代码,我们可以确保PDF文档的完整性和电子签名的有效性,从而在处理重要文件时提供额外的安全保障。


相关文章推荐:
C# 在PDF中添加数字签名
C# 获取PDF数字签名证书
C# 加密、解密PDF文档

相关推荐
weixin_4280053014 小时前
C#调用 AI学习从0开始-第3阶段RAG向量数据库-文档切分与入库第15天
人工智能·学习·c#·向量数据库·rag·qdrant·文档切分与入库
心平气和量大福大15 小时前
C#-WPF-布局-Grid
c#·wpf·visual studio
xiaowang1234shs15 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
TeamDev15 小时前
JxBrowser 9.3.1 版本发布啦!
java·前端·javascript·c#·混合应用·jxbrowser·浏览器控件
云泽80816 小时前
Visual Studio 2026 新手保姆级教程:环境搭建、界面优化与编译器配置详解
开发语言·c++·c·开发工具·visual studio
格林威18 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
Vae_Mars18 小时前
C#中多线程异步操作的方法-Parallel.ForEachAsync
开发语言·c#·php
Arbori_2621518 小时前
Rider 调试 VisionMaster C# 用户脚本
c#·visionmaster
暗暗别做白日梦1 天前
Pulsar 消息同步机制
c#·linq