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

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文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】机器学习的重要方法——线性回归算法深度探索与未来展望

欢迎来到 破晓的历程博客 引言 在数据科学日益重要的今天&#xff0c;线性回归算法以其简单、直观和强大的预测能力&#xff0c;成为了众多领域中的基础工具。本文将详细介绍线性回归的基本概念、核心算法&#xff0c;并通过五个具体的使用示例来展示其应用&#xff0c;同时探…

深入STM32的ADC世界:从理论到实践,打造精准数据采集系统

摘要: 在嵌入式系统中&#xff0c;模拟信号的采集与处理至关重要。本文将深入浅出地介绍STM32的ADC模块&#xff0c;结合实际项目&#xff0c;详细阐述ADC的工作原理、配置方法以及数据处理技巧&#xff0c;并辅以Mermaid图表和代码示例&#xff0c;助你轻松掌握ADC应用开发。 …

最小步数模型——AcWing 1107. 魔板

最小步数模型 定义 最小步数模型通常是指在某种约束条件下&#xff0c;寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说&#xff0c;它涉及确定一个序列或路径&#xff0c;使得按照特定规则执行…

智能数字人直播带货软件源码系统 实现真人直播形象 带完整当然安装代码包以及搭建教程

系统概述 智能数字人直播带货软件源码系统&#xff0c;是一个集成了先进的人工智能、3D建模、语音合成、自然语言处理等技术于一体的创新平台。它旨在通过构建高度定制化的虚拟主播&#xff0c;为用户提供沉浸式、高效能的直播体验。与传统直播相比&#xff0c;该系统的核心优…

基于自回归超先验的有损图像压缩框架

文章信息 论文题目为《Joint Autoregressive and Hierarchical Priors for Learned Image Compression》&#xff0c;文章来自NIPS2018谷歌团队,是第一篇端到端图像压缩论文《variational image compression with a scale hyperprior》的改进版本&#xff0c;在《variational i…

Java 并发集合:CopyOnWrite 写时复制集合介绍

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 016 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

IIC电平转换电路原理

一、电平转换的必要性 在IIC主从设备连接时&#xff0c;由于主从设备可能存在不同的电源电压&#xff08;如5V、3.3V、1.8V等&#xff09;&#xff0c;导致需要进行电平转换以确保正常通信。 二、电平转换电路的基本组成 电平转换电路通常包括上拉电阻、MOS管&#xff08;通常…

C++基础(二):C++入门(一)

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式 等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本篇博客主要目标&#xff1a; 1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计…

AI与音乐:终极对决,机械混音师将扬弃人类知识!

AI与音乐 一. 引言1.1 AI在音乐创作中的应用1.2 AI在音乐表演与演奏中的应用 二. AI在音乐创作中的应用2.1 AI在音乐创作中的应用技术2.1.1 深度学习2.1.2 遗传算法2.1.3 神经网络 2.2 不同AI算法在音乐创作中的应用2.2.1 使用LSTM神经网络模型生成新的音乐2.2.2 使用基于模板的…

`THREE.LineBasicMaterial` 是 three.js 中用来创建用于绘制线条的基本材质。

demo案例 THREE.LineBasicMaterial 是 three.js 中用来创建用于绘制线条的基本材质。以下是它的入参、出参、方法和属性的详细说明。 入参 (Constructor Parameters) THREE.LineBasicMaterial 构造函数可以接收一个包含多个属性的对象。常用属性如下&#xff1a; const ma…

c++ 构造,析构,拷贝,移动构造函数

文章目录 概述1.构造函数2. 拷贝构造函数3.移动构造函数4.析构函数 例子QTUE4/5 c 小结 概述 对于c来说&#xff0c;最基础的是类。对于一个类来说&#xff0c;主要由以下函数构成。如下&#xff1a; 构造函数拷贝构造函数移动构造函数析构函数 当然&#xff0c;还有一个操作…

做测试/爬虫 selenium 元素定位 谷歌浏览器 插件推荐,提高元素定位效率

注:插件均在谷歌应用商店 下载 1.XPath Helper 插件 作用&#xff1a;用于Html中对目标字段或者属性值进行匹配 快捷启动&#xff1a;ctrl shift x 示例图如下&#xff1a; 2. ChroPath 插件 作用&#xff1a; 提高元素定位效率 启动&#xff1a;谷歌浏览器 按 F12 -&g…

Query Rewriting for Retrieval-Augmented Large Language Models

文章目录 题目摘要方法实验 题目 检索增强大语言模型的查询重写 论文地址&#xff1a;https://arxiv.org/abs/2305.14283 项目地址&#xff1a;https://github.com/xbmxb/RAG-query-rewriting 摘要 大语言模型&#xff08;LLM&#xff09;在检索--然后阅读&#xff08;retriev…

使用 Amazon Bedrock Converse API 简化大语言模型交互

本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API&#xff0c;来简化与各种大型语言模型的交互。该 API 提供了一致的接口&#xff0c;可以无缝调用各种大型模型&#xff0c;从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每…

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a;…

学习记录之数学表达式(6)

目录 十二、图与网络12.1 有向图12.2 元组与对象12.3 二元关系与有向图12.4 无向图12.5 有向网络12.6 作业 十三、树13.1 例子13.2 定义13.3 Java代码13.4 作业 十四、 m \mathbf{m} m叉树14.1 预备知识&#xff1a;字符串14.2 m \mathbf{m} m-叉树的定义14.3 Java代码14.4 作…

mysql-sql-第十三周

学习目标&#xff1a; sql 学习内容&#xff1a; 37.查询各科成绩最高分、最低分和平均分&#xff1a; 以如下形式显示&#xff1a;课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>60,中等为&#xff1a;70-80,优良为&#xff1a;80-90,优秀…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

OpenSSH漏洞扫描(CVE-2024-6387、CVE-2006-5051、CVE-2008-4109)

目录 POC&#xff1a;ssh_poc.py 使用方法 github CVE-2024-6387 漏洞信息 补丁 POC&#xff1a;ssh_poc.py import sys import socket import argparse import threading import queue import os from datetime import datetime from urllib.parse import urlparse from…