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()
方法。
主要步骤:
- 创建
PdfDocument
对象,并使用LoadFromFile()
方法加载 PDF 文件。 - 获取 PDF 文件中的表单,然后使用获取表单字段集合。
- 遍历所有字段,并判断当前字段是否为签名字段(
PdfSignatureFieldWidget
类)。 - 如果是签名字段,则通过
PdfSignatureFieldWidget.Signature
属性获取该PDF 签名。 - 使用
PdfSignature.VerifySignature()
方法检查 PDF 签名的有效性 - 输出结果。
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("无效签名");}}}}}
}
验证结果:
使用C# 验证PDF文档是否被修改
验证PDF文档是否被修改也能间接验证电子签名的有效性,如果在签名之后文档内容被修改,那么PDF签名也将失效。通过使用 PdfSignature
类提供的 VerifyDocModified()
方法可以快速验证PDF文档的完整性。
主要步骤:
- 创建
PdfDocument
对象,并使用LoadFromFile()
方法加载 PDF 文件 - 获取 PDF 文件中的表单,然后使用获取表单字段集合。
- 遍历所有字段,并判断当前字段是否为签名字段(
PdfSignatureFieldWidget
类)。 - 如果是签名字段,则通过
PdfSignatureFieldWidget.Signature
属性获取该PDF 签名。 - 使用
PdfSignature.VerifyDocModified()
方法验证签名后文档是否被修改。 - 输出结果。
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文档的完整性和电子签名的有效性,从而在处理重要文件时提供额外的安全保障。
相关文章推荐:
C# 在PDF中添加数字签名
C# 获取PDF数字签名证书
C# 加密、解密PDF文档
相关文章:

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

2小时动手学习扩散模型(pytorch版)【入门版】【代码讲解】
2小时动手学习扩散模型(pytorch版) 课程地址 2小时动手学习扩散模型(pytorch版) 课程目标 给零基础同学快速了解扩散模型的核心模块,有个整体框架的理解。知道扩散模型的改进和设计的核心模块。 课程特色…...

Centos7网络配置(设置固定ip)
文章目录 1进入虚拟机设置选中【网络适配器】选择【NAT模式】2 进入windows【控制面板\网络和 Internet\网络和共享中心\更改适配器设置】设置网络状态。3 设置VM的【虚拟网络编辑器】4 设置系统网卡5 设置虚拟机固定IP 刚安装完系统,有的人尤其没有勾选自动网络配置…...
英伟达被“压制”的25年
十九世纪中叶的美国西部,掀起了一场轰轰烈烈的淘金热,但最终赚到钱的,并不是拿命去赌的淘金者。一个名叫萨姆布瑞南的商人,通过向淘金者出售铲子,成了加州历史上第一位百万富翁。 每一次风口出现时,总有企…...
windows安装Gitblit还是Bonobo Git Server
Gitblit 和 Bonobo Git Server 都是用于托管Git仓库的工具,但它们是基于不同平台的不同软件。 Gitblit 是一个纯 Java 写的服务器,支持托管 Git,Mercurial 和 SVN 仓库。它需要 Java 运行环境,适合在 Windows、Linux 和 Mac 平台…...

仪器校准的概念与定义,计量校准是什么?
仪器校准的定义,在之前所颁布的《国际计量学词汇 基础和通用概念及相关术语》文件中,已经有了明确说明,而该文件做了修改以后,在后续新的定义中,仪器校准具体被分为两部分,第一步是将被计量仪器和计量校准的…...
Vue3+Pinia
1.单纯调接口(安装pinia及引入如下第一张图) 1.npm install pinia2.在main.js里引入即可import { createPinia } from piniaapp.use(createPinia()) 1.stores建立你文件的ts、内容如下:1-1 import { defineStore } from pinia1-2 import { findPageJobSet } from …...

label studio数据标注平台的自动化标注使用
(作者:陈玓玏) 开源项目,欢迎star哦,https://github.com/data-infra/cube-studio 做图文音项目过程中,我们通常会需要进行数据标注。label studio是一个比较好上手的标注平台,可以直接搜索…...

高并发场景下的热点key问题探析与应对策略
目录 一、问题描述 二、发现机制 三、解决策略分析 (一)解决策略一:多级缓存策略 客户端本地缓存 代理节点本地缓存 (二)解决策略二:多副本策略 (三)解决策略三:热点…...
学习一下C++中的枚举的定义
目录 普通枚举 强类型枚举 普通枚举 枚举类型在C中是通过关键字enum来定义的。下面是一个简单的例子: enum Color { RED, GREEN, BLUE }; 在这个例子中,我们定义了一个名为Color的枚举类型,它包含了三个枚举值:RED、GRE…...

开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D导诊系统源码
开发一套java语言的智能导诊需要什么技术?java springboot mysql IDEA互联网智能3D导诊系统源码 医院导诊系统是一种基于互联网和3D人体的智能化服务系统,旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资;智慧…...
C++| STL之string
前言:最近在做LeetCode算法题,C字符串通常都是string作为输入,所以补充一下STL里面string。在介绍的具体使用的时候,会补充char字符串相关的进行对比。 string 创建大小和容量遍历字符串比较插入字符拼接字符串分配内存查找截取分…...

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式4599张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4599 标注数量(xml文件个数):4599 标注数量(txt文件个数):4599 标注…...
JAVA实现麦克风说话同声传译
一、能力与场景说明 同声传译,又称同步口译或同声翻译,是一种专业的口译形式,指的是在讲话者发言时,口译员几乎同时将讲话内容翻译成目标语言。这种翻译方式通常用于国际会议、高级别政治或商业会谈、研讨会和其他需要即时多语言…...

LabVIEW与PLC通讯方式及比较
LabVIEW与PLC之间的通讯方式多样,包括使用MODBUS协议、OPC(OLE for Process Control)、Ethernet/IP以及串口通讯等。这些通讯方式各有特点,选择合适的通讯方式可以提高系统的效率和稳定性。以下将详细介绍每种通讯方式的特点、优点…...

2024/6/30 英语每日一段
Years of economic and political turbulence have brought stagnation.“In a world where there is more risk and uncertainty, people become reluctant to voluntarily move jobs and find better jobs,” says Manning. At the same time, businesses have cut back on i…...
Postman接口测试工具的原理及应用详解(五)
本系列文章简介: 在当今软件开发的世界中,接口测试作为保证软件质量的重要一环,其重要性不言而喻。随着前后端分离开发模式的普及,接口测试已成为连接前后端开发的桥梁,确保前后端之间的数据交互准确无误。在这样的背景…...

208.贪心算法:买卖股票的最佳时机||(力扣)
代码解决 class Solution { public:int maxProfit(vector<int>& prices) {int result 0; // 初始化结果为0,表示初始利润为0// 从第二天开始遍历价格数组for (int i 1; i < prices.size(); i) {// 如果当天价格比前一天价格高,则将差价加…...

【论文阅读】伸缩密度比估计:Telescoping Density-Ratio Estimation
文章目录 一、文章概览(一)问题提出(二)文章工作 二、判别比估计和密度鸿沟问题三、伸缩密度比估计(一)核心思想(二)路标创建(三)桥梁构建(四&…...
MongoDB数据库 MQL (MongoDB Query Language)语句大全
基本命令 连接到 MongoDB mongo显示所有数据库 show dbs选择(或创建)数据库 db集合操作 显示当前数据库中的所有集合 show collections创建集合 db.createCollection("myCollection")删除集合 db.myCollection.drop()文档操作 插入文…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...