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

news2024/11/24 3:37:43

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

Free Spire.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#示例代码:

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("无效签名");
                    }
                }
            }
        }
    }
}

验证结果:
验证PDF签名

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

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

主要步骤:

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

C#示例代码:

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文档完整性

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TS】TypeScript 入门指南:强大的JavaScript超集

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 入门指南&#xff1a;强大的JavaScript超集一、TypeScript 简介1.1 …

【ARM系列】1 of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

零成本、高收益!我是怎么通过Stable Diffusion做副业的,AI绘画助你轻松开启副业!

通过Stable Diffusion赚钱的方法 人工智能&#xff08;AI&#xff09;已经在创意领域取得了重大进展。特别是Stable Diffusion为各行各业提供了创新解决方案。从播客标志到生日蛋糕设计&#xff0c;由AI生成的艺术呈现了个人和企业的无限可能性。以下是您可以通过Stable Diffu…

利用MATLAB绘制傅里叶变换后的图形

题目如下&#xff0c;其中周期是 2 π 2\pi 2π y { 1 0 < x < π 0 x 0 − 1 − π < x < 0 y\begin{cases} 1 \ 0<x<\pi\\ 0 \ x0\\ -1 \ -\pi <x<0\\ \end{cases} y⎩ ⎨ ⎧​1 0<x<π0 x0−1 −π<x<0​ 计算可得 a n 1 π ∫ −…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

气象监测仪:现代气象观测的利器与未来展望

在科技日新月异的今天&#xff0c;气象监测仪作为气象观测的重要工具&#xff0c;以其独特的功能优势&#xff0c;为气象预报、灾害预警以及科学研究等领域提供了强有力的支持。本文将从气象监测仪的功能优势出发&#xff0c;探讨其在现代气象观测中的应用及未来发展。 一、气象…

如何实现公网环境远程连接本地局域网宝塔FTP服务远程管理文件

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

汇编语言程序设计-6-中断及其应用

6. 中断及其应用 文章目录 6. 中断及其应用6.0 阶段导学6.1 移位指令-shl/shr/sal/sar/rol/ror/rcl/rcr6.2 操作显存数据6.3 描述内存单元的标号6.4 数据的直接定址表6.5 代码的直接定址表6.6 中断及其处理6.7 编制中断处理程序6.8 单步中断6.9 由int指令引发的中断-int6.10 BI…

嵌入式Linux系统编程 — 6.1 信号的基本概念

目录 1 信号的概念和作用 1.1 什么是信号 1.2 信号的目的 1.3 信号如何处理 2 信号的分类 2.1 可靠信号与不可靠信号 2.2 实时信号与非实时信号 3 常见信号与默认行为 3.1 信号本质上是 int 类型数字编号 3.2 常见信号 1 信号的概念和作用 1.1 什么是信号 信号是一…

为什么要学习大模型应用开发?原因80%的人都不知道

0 prompt engineer 就是prompt工程师它的底层透视。 1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#x…

Python安装,几个步骤轻松实现(超详细)

目录 步骤一、进入官网 步骤二、将鼠标放在Downloads上&#xff0c;选择All releases 步骤三、 下滑找到Looking for a specific release&#xff0c;选择python版本点击Download安装 步骤四、下滑找到Files&#xff0c;以windows64为例&#xff0c;点击下载 步骤五、安装Py…

RTL8305NB从电口模式切换为光口模式

#if 1//下面是参考案例 //RTL8305NB#define PORT2_PHY_ADDR 0x05 // SFP Port2 PHY地址 #define STATUS_REG_ADDR 0x01 // 状态寄存器地址#define MDC_PIN GPIO_Pin_13 //MDC (PC13) #define MDIO_PIN GPIO_Pin_6 //MDIO (PE6)#define MDIO_DELAY 10 // us #defin…

秋招Java后端开发冲刺——基础篇5(String集合)

一、String String类是Java中字符串操作类&#xff0c;位于java.lang包下String类型对象的底层使用字符数组char[]存储字符串&#xff0c;由final修饰且没有提供公共的修改方法&#xff0c;因此String对象是不可变的。常见方法 方法名作用trim()去掉字符串首尾空字符split(分…

[AI Perplexica] AI驱动的开源搜索引擎

之前&#xff0c;我们有介绍过 Perplexcity 现在&#xff0c;开源市场上&#xff0c;也有一款对标产品 Perplexica &#xff0c;我们来看下 界面很像 介绍 Perplexica是一个开源的、由AI驱动的搜索工具或搜索引擎&#xff0c;它深入互联网寻找答案。受到Perplexity AI的启发…

警惕!帕金森老人身体恶化七大征兆,家有老人必看!

帕金森病&#xff0c;这个在老年人群中越来越常见的神经系统疾病&#xff0c;以其独特的“静止性震颤、运动迟缓、肌强直和姿势平衡障碍”等四大症状&#xff0c;成为许多家庭心中的痛。然而&#xff0c;帕金森病的进展并非一蹴而就&#xff0c;而是有着一系列的身体变坏征兆。…

vue3源码(六)渲染原理-runtime-dom

1、从入口文件看实现 项目入口文件 import { createApp } from vue import ./style.css import App from ./App.vuecreateApp(App).mount(#app)文件位置core\packages\runtime-dom\src\index.ts 保证了render的唯一性 // // rendererOptions 是patchProp 和nodeOps的合集&a…

材料科学SCI期刊,IF=6+,超高录用率,2个月录用

一、期刊名称 Advanced Electronic Materials 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;材料科学 影响因子&#xff1a;5.3 中科院分区&#xff1a;2区 三、期刊简介 Advanced Electronic Materials 是一个跨学科论坛&#xff0c;旨在为材料科学、…

YOLOv8-对注意力机制模型进行通道剪枝-同时实现涨点和轻量化【附代码】

文章目录 前言视频效果文章概述必要环境一、训练自己的模型1、 训练命令2、 训练参数解析 二、模型剪枝1、 对训练好的模型将进行剪枝2、 剪枝代码详解1.解析命令行参数2. 定义剪枝函数3. 定义剪枝结构4. 更新注意力机制5. 保存更新后的模型6. 主函数 三、剪枝后的训练运行命令…

Windows 11 安装 安卓子系统 (WSA)

How to Install Windows Subsystem for Android (WSA) on Windows 11 新手教程&#xff1a;如何安装Windows 11 安卓子系统 说明 Windows Subsystem for Android 或 WSA 是由 Hyper-V 提供支持的虚拟机&#xff0c;可在 Windows 11 操作系统上运行 Android 应用程序。虽然它需…

c++读取文件时出现中文乱码

原因&#xff1a;UTF-8格式不支持汉字编码 解决&#xff1a;改成ANSI&#xff0c;因为ANSI编码支持汉字编码