文章目录

  • 前言

    一、数字签名是什么?

    二、数字签名的原理

    三、PDF的签章

    1.引入Nuget包 iTextSharp

    2.核心代码

    3.客户端调用

    4.文档准备

    效果


前言

最近看到互联网上越来越多的合同都是以PDF的方式发送合同,并让用户感受到真切的法律效用,PDF合同文件都会有签章。

他有两方面好处,一个是让用户看到合同时有个正式的公司签章;另一个是PDF文件的签名能够防止篡改,具有一定的法律效应。

一、数字签名是什么?

来源:C#数字签名 - micwin - 博客园

数字签名基于哈希算法和公钥加密算法,对明文报文先用哈希算法计算摘要,然后用私钥对摘要进行加密,得到的值就是原文的数字签名。

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。

一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。

二、数字签名的原理

  1. 发件人生成或取得独一无二的加密密码组,包括私钥和公钥。
  2. 发件人书写电子邮件
  3. 发件人用安全的摘要算法获取电子邮件的信息摘要
  4. 发件人再使用私钥对信息摘要进行加密,即可得到数字签名。  
  5. 发件人将数字签名附在信息之后.
  6. 发件人将数字签名和信息(加密或未加密)发送给电子收件人.
  7. 收件人使用发件人的公共密码(公钥)确认发件人的电子签名,即将发件人的数字签名通过公钥进行解密,得到信息摘要
  8. 收件人使用同样安全的摘要算法,获取信息(加密或未加密)的"信息摘要".
  9. 收件人比较两个信息摘要.假如两者相同,则收件人可以确信信息在签发后并未作任何改变
  10. 收件人从证明机构处获得认证证书(或者是通过信息发件人获得),这一证书用以确认发件人发出信息上的数字签名的真实性.证明机构在数字签名系统中是一个典型的受委托管理证明业务的第三方.该证书包含发件人的公共密码和姓名(以及其他可能的附加信息),由证明机构在其上进行数字签名.

三、PDF的签章

1.引入Nuget包 iTextSharp

代码如下(示例):

Install-Package iTextSharp

iTextSharp开源地址:

itext/itextsharp - GitHub

2.核心代码

代码如下(示例):

        /// <summary>/// 为PDF文档签名,并附加公章、附带信息/// </summary>/// <param name="fileName">PDF源文件</param>/// <param name="SignedFileName">签名后的输出文件</param>/// <param name="SignerName">签署者</param>/// <param name="SignatureImg">公章图片</param>/// <param name="Pkcs">证书</param>/// <param name="Password">密钥</param>/// <param name="SignReason">原因</param>/// <param name="SignLocation">位置</param>private static void PdfSignWithStamp(string fileName,string SignedFileName,string SignerName,string SignatureImg,string Pkcs,string Password,string SignReason= null,string SignLocation = null){//PKCS概念:.p12是PKCS#12文件的文件扩展名,也称为“PFX文件”的备用扩展,它是保存私钥和证书的组合格式,是最新的签名实用程序使用的格式。//一般从规范的证书颁发机构获得有效的认证证书;//或者不考虑法律效用等问题,可以直接通过OpenSSL生成PKCS。//具体生成方法:搜索“OpenSSL P12”var p12 = new Pkcs12Store(new FileStream(Pkcs, FileMode.Open, FileAccess.Read), Password.ToCharArray());var alias = "";foreach (string al in p12.Aliases){if (p12.IsKeyEntry(al) && p12.GetKey(al).Key.IsPrivate){alias = al;   //获得签名中的别名break;}}//获得签名实体var pk = p12.GetKey(alias);var rsaKey = pk.Key as RsaPrivateCrtKeyParameters;//公司盖章的起始位置,在指定时需要设定页码int xPos = 450;int yPos = 100;  //相对底部int width = 100;int heith = 100;//原始文件using (PdfReader reader = new PdfReader(fileName))using (FileStream fout = new FileStream(SignedFileName, FileMode.Create, FileAccess.ReadWrite))using (PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', "temp", true)){//公章图片构造,需要注意的是,默认调试会报错。//需要在报错的提示信息下边,选择:调试->异常->CLI的所有复选框均勾掉PdfSignatureAppearance appearance = stamper.SignatureAppearance;if (!string.IsNullOrEmpty(SignReason))appearance.Reason = SignReason;if (!string.IsNullOrEmpty(SignLocation))appearance.Location = SignLocation;appearance.SignDate = DateTime.Now;//将公章附加到指定页码的具体位置中appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(xPos, yPos, xPos + width, yPos + heith), 10, null);//公章图片appearance.Image = iTextSharp.text.Image.GetInstance(SignatureImg);appearance.ImageScale = 0.3f;appearance.Image.Alignment = 300;appearance.Acro6Layers = true;//公章上层附加的文字StringBuilder buf = new StringBuilder();buf.Append($"Signed:{SignerName}{Environment.NewLine}");buf.Append($"Date: {appearance.SignDate.ToString(@"yyyy/MM/dd HH:mm:ss")}");appearance.Layer2Text = buf.ToString();//签名SHA-256可选SHA-1IExternalSignature es = new PrivateKeySignature(rsaKey, "SHA-256");var certificat = new Org.BouncyCastle.X509.X509Certificate[] { p12.GetCertificate(alias).Certificate };MakeSignature.SignDetached(appearance, es, certificat, null, null, null, 0, CryptoStandard.CMS);}}

3.客户端调用

        static void Main(string[] args){string KeyStore = @"doc\pkcs12";string Password = "password";string Src = @"doc\合同样本(来自网络).pdf";string Out = @"doc\合同签名与印章(样例).pdf";string Img = @"doc\stamp.jpg";string Company = @"company";Console.WriteLine("开始PDF签名...");//PDF签名,且附加图片PdfSignWithStamp(Src, Out, Company, Img, KeyStore,Password);Console.WriteLine("签名完成!");Console.ReadLine();}

4.文档准备

1.干净的PDF源文件:“合同样本(来自网络).pdf”

2.测试用的公章图片:“stamp.jpg”

3.OpenSSL生成的p12证书,可以直接从iTextSharp的源码中拷贝一个。


效果

PDF文件签名与盖章相关推荐

  1. java实现写字板对pdf文件签名

    java实现写字板对pdf文件签名 思路 首先明白写字板签名完输出的是base64的图片,剩下的就是将此图片插入到pdf文件中,实现此步骤的技术很多,可以用itex5但是为了实现与其他数据一起动态插入 ...

  2. 使用Adobe Acrobat去除PDF文件签名

    1.打开Adobe Acrobat,选择工具->创建PDF->空白页面,创建 2.选择工具->组织页面,插入->从文件,插入带有签名的PDF文件 3.删除空白页 4.选择工具- ...

  3. 三分钟带你玩转PDF文件签名

    文章目录 需求 解决方案一 解决方案二 需求 客户希望在 PDF 文件上,借助手写板完成签名操作,其中手写板是个可以把签名转成图片的的硬件,硬件部分由于来源繁多,此处略过,默认已经拿到图片签名. 解决 ...

  4. pageoffice 骑缝章_用 pageoffice 实现 pdf 文件签字盖章

    电子签名/签章的使用场景有哪些? 1. 电子报告 2. 证书电子版固化 3. 企业工作流审批 4. 电商订单存证 5. 系统单据保全 为什么要在pdf 文件上盖章? 在很多合同签订的过程中,很多人直接 ...

  5. PDF文件数字签名和加密使用

    WoSign PDF文件签名证书属于Class 3 客户端单位证书,不仅可以用于电子邮件数字签名和加密,以及登录企业内部管理系统的强身份认证,而且还可以用于数字签名和加密PDF文件,以实现企业内部管理 ...

  6. 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )

    文章目录 一.下载 "e 签保" 应用 二.使用 手机号 + 短信验证码 登录 三.发起签署 四.签名 五.获取签名后的 PDF 文件及出证信息 一.下载 "e 签保&q ...

  7. 使用Adobe Acrobat为PDF文件添加签名(图片+签名)

    1.使用Adobe Acrobat打开PDF文件,并切换到工具页,点击证书 2.选择数字签名,然后在文档中要签名的位置上单击并绘制一个区域 3.创建签名证书,点击"签名为:"下拉框 ...

  8. 使用Adobe Acrobat编辑PDF,实现文件签名

    昨天学校要派遣接收函,接收函需要有本人签字.接收函是PDF格式,所以需要编辑该PDF文件,插入本人签名. Adobe Acrobat是一款非常好用的PDF编辑工具,使用该工具就可以轻松实现对PDF文件 ...

  9. PDF文件如何添加签名

    PDF文件如何添加签名?在我们平常的工作中,许多文件都需要签名确认执行.如果有一份PDF文件需要签名,屏幕前的你知道应该如何操作吗?如果你并不了解PDF文件应该如何添加签名,那么没关系,继续往下阅读你 ...

最新文章

  1. 27亿参数的「野生版」GPT-3开源,GitHub项目2.9K Star量
  2. import-module的注意事项与NDK_MODULE_PATH的配置
  3. 如何检测过时的Kubernetes API
  4. MySQL半同步的配置
  5. Vue 过滤器filters
  6. 手机蓝牙如何减少延时_JEET ONE真无线耳机测评-高颜值低延时的集合
  7. adb小天才,小天才调试工具包下载
  8. 现代交换技术的基本概念及基本知识
  9. 显示100以内的所有偶数php,vb100-急需vb编程求100以内所有奇数和及所有偶数和vb编程求100以 爱问知识人...
  10. 敌兵布阵 HDU - 1166
  11. 期货与期权的主要区别与联系?
  12. 计算机组成原理知识点梳理
  13. iOS:编译问题Presenting view controllers on detached view controllers is discouraged
  14. 软著申请全流程图文解析与注意事项
  15. 什么是WIFI真机同步?
  16. 自媒体推广该怎么做?学懂这10招,走路横着走
  17. 1. 【Part2】 Contour Detection and Hierarchical Image Segmentation【轮廓检测图像分割】
  18. stm32mp157a-dk1 编译 Ubuntu 20.04固件
  19. 央视3·15晚会起底直播乱象 直播平台佣金高达50%
  20. C6000 EDMA 使用心得总结

热门文章

  1. JSM之ActivityMQ
  2. 初学C语言一些知识点的整理
  3. PyTorch中repeat、tile与repeat_interleave的区别
  4. floor ceil fract 函数的区别
  5. 网络安全笔记 -- 逻辑越权(水平垂直越权)
  6. (原创)暴力破解西电校园网密码
  7. android 点击变色的两种情况、textview点击变色以及自定义checkbox
  8. android 全景拍照 sdk,Android全景SDK | 百度地图API SDK
  9. APOllO服务器性能,HPE Apollo 4200 Gen9 服务器
  10. WebRTC音视频之噪音消除功能