PDFKit.NET 数字签名与文档处理

PDFKit.NET 2.0 是一个百分百的.net组件,用来创建以及操作PDF文档。这篇文章我将专注于它的“数字签名”功能。数字签名可以被用来认证PDF的源文件(谁签名过它)并且提供一个PDF文档的完整性(看文档在被签名过后被是否更改过)。我将展示怎样使用一个或多个数字签名技术以及怎样验证数字签名。

内容

  • 签名
  • 更新
  • 验证

签名

请看下面这个表单:

图片1:带有字段的PDF表单以及两个空的签名字段

这个表单的字段中分为两段。一段是学生信息,一段是老师信息。通常,首先由学生填写他的部分,并且签名该文档。下面的程序可以完成这个功能:



在执行上面的代码后,在PDF Reader中打开文档,看起来如下图所示:


图片2:应用第一次签名后

注意PDF 文档中的问号。这意味着该证书还没有被客户端信任,它只是简单地将证书添加到信任域中。

接下来,老师将查看到学生的数据,然后填写最终剩余的那段字段,然后给予签名。下面这段代码实现了该功能:



如果你仔细看上面这段代码。它确实与之前的这段代码很相似。唯一明显的不同是传递了一个额外的参数给Document.Write方法:DocumentWriteMode.AppendUpdate。这告诉PDFKit.Net保存所有的改变以Update模式。我将在下一节讨论它。

在执行上面的代码之后,打开PDF 阅读器,文档看起来类似下面的图片:


图片3:在应用第二次签名之后

注意:第一次签名后的图标(问号)现在已经变成了警告的惊叹号形式。它用来标识,文档在签名后已经被修改。当然这仅仅是一个例子。

更新

注意当我们保存了第二次签名,我们传递了一个额外的参数给Document.Write方法:DocumentWriteMode.AppendUpdate。它只是PDFKit.NET保存新的字段数据并且以Update的形式签名。这意味着源PDF文件是完好的,未被修改的。并且改变是连贯的。下面的图片展示了这个改变:


图片4:PDF更新

因此,第一次签名仍然有效,因为签署的确切数据并没有被修改。我们只是增加了更新。

所以,在保存完更新之后。事实上关于该文档有两个版本:一个是被学生签名过的,而另一个是老师签名过的。它对检索一个给定的应用签名的确切文件很有用。很显然签名者只关注该版本,而不是事后创建的那个版本。

给一个文档,你可以枚举出所有的更新以及文档的版本,并且在硬盘上保留一份拷贝:


但也许或者说更有趣的是,你能够打开一个签名过后的文档并且对每一个签名域都可以检索签署的更新。接下来的代码简单得枚举了所有的签名域并且保存了签署的更新:


在执行了上面的代码后,两个新的文档被存储:studentSignature.pdf 和 teacherSignature.pdf。每一个文档都展示了各自的域被签名过的版本。

验证

到现在,我们已经讨论了文档的签名。验证的功能留给了PDF Reader应用程序。但PDFKit.Net也允许你编程来验证签名。它就像下面的这段代码一样极其地简单。这个例子打开了那个被学生、老师以及枚举过签名字段的PDF文档。每一次签名、签名的状态信息都被写入了控制台。


在执行完上面这段代码,下面的图片显示了输出的结果:


译者注:

代码的实现需要两个数字证书文件,也就是两次签名的代码中的两个以”.pfx”结尾的文件。具体参见百度百科:http://baike.baidu.com/view/1128036.htm

数字签名技术主要用于标识文件的完整性,不可篡改、不可抵赖。如果A要传递给B一个文件。那么需要用A使用A的私钥加密,B使用A的公钥解密。而如果在Web系统中实现这种机制。可以把Server作为第三方认证中心。PDF的制作方、上传方类似用户A,PDF的下载方类似用户B。数字证书通常由第三方提供,也由第三方负责认证。

原文链接:http://www.codeproject.com/KB/showcase/digitalsignatures.aspx




posted @ 2011-09-12 15:59  程序员天下  阅读(659)  评论(0编辑  收藏  举报