All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ms,sql,更新表A中某列为表B中的值_mssql学习_编程技术
PHP技巧:PHP关于中文汉字替换与模式匹配的问题_[PHP教程]
PHPUnit袖珍指南之PHPUnit的目的_[PHP教程]
安全攻略:PHP脚本木马的高级防范_php资料_编程技术
,2.0,中快速实现单点登陆_[Asp.Net教程]
轻松实现无刷新三级联动菜单[VS2005与AjaxPro]_[Asp.Net教程]
ASP.NET2.0:使用GridView绑定XmlDocument对象_[Asp.Net教程]
PHPer为什么被认为是草根?_php资料_编程技术
Asp.Net、Ado.net,数据库编程超级攻略_[Asp.Net教程]
菜鸟也学习ASP.NET如何读取数据库内容_[Asp.Net教程]
Reading number is top 10 pictures
原子弹轰炸长崎的珍贵照片
Ashlynn Brooke a group sexy photo3
赵惟依写真2
The real super beauty11
Hunan province aizhai super-large suspension bridge open to traffic and 4 world first2
看看什么叫美景
The cat shit
Nine school beauty star those gossip matters
Beautiful vacuum girl3
含苞欲放的素颜美少女1
Download software ranking
虚拟机汉化软件
尖东毒玫瑰A
SP4 for SQL2000
Tram sex maniac 2 (H) rar bag9
打鸟视频
Eclipse-CALMSANNY (second edition)
matrix1
Unix video tutorial6
VeryCD电驴(EasyMule) V1.1.9 Build09081
星际争霸1.08硬盘免安装版
delv published in(发表于) 2014/1/16 9:34:17 Edit(编辑)
用C#实现pdf文件的完整性验证_[Asp.Net教程]

用C#实现pdf文件的完整性验证_[Asp.Net教程]

用C#实现pdf文件的完整性验证_[Asp.Net教程]

现在对文件的完整性验证,防止文件被篡改的技术已经比较成熟,一般使用数字签名,数字水印等,最近我在一个项目中也遇到了防篡改的需求。该项目要求用户将原始发票用专门的扫描程序扫描成pdf文件,然后将该pdf文件传到服务器上,在上传的同时必须要验证这个pdf是没有被手工修改过的。我刚一接触到这个需求想到的就是使用数字水印,要不然就直接使用PDF的数字签名功能,不过这些方法都感觉比较比较复杂,一大堆的英文文档也没有心思去研究,于是琢磨了半天,写了一个简化版的数字水印程序,实现了pdf文件完整性验证。
验证的基本思路是:
对文件全部内容计算其MD5值,这样无论用户修改了文件的任何一个地方,那么生成的MD5的是完全不一样的,我们可以将这个MD5写到文件的一个隐藏区,一般二进制文件格式都有文件头和文件体部分,而文件头是用户看不到的,一般也会预留一部分字节用于以后扩展,或可以在文件头写入特殊标记的数据。于是研究了一下pdf文件的格式,试着往其第10个字节插入了MD5值,结果文件虽然可以使用,但是每次打开的时候都会提示“文件修复”。原来是写在头上面的内容将pdf文件的字节数和文件中对象的地址改变了,导致了文件错误,原因找到了那么解决办法也就有了,为了不改变pdf文件中对象的地址,那么我们将这个md5写在文件尾不就可以了嘛!于是在客户端(扫描程序)将扫描出的pdf文件流计算MD5值,然后将该文件流和MD5值一起写到硬盘上,形成一个添加了MD5值的pdf文件。文件可以正常打开和使用,而且用户也不会看到我们添加的这个MD5值。
在服务器端,我们将上传上来的文件流除了最后32个字节以为的部分计算MD5值(这儿取32个字节是因为最后这32字节是我们写的MD5),将前面部分算出的MD5和最后32个字节的MD5进行比较,如果一样那么说明这个文件从扫描程序生成以后没有被人为篡改过,否则说明该文件要么不是用我们这个扫描程序生成的要么就是被篡改了。这样验证通过以后我们才将该文件流写到服务器硬盘上。
相关程序代码
1 public class MD5
2 {
3 /**////


4 /// 对给定文件路径的文件加上标签
5 ///

6 /// 要加密的文件的路径
7 /// 标签的值
8 public static string MD5pdf(string path,string key)
9 {
10
11 try
12 {
13 FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
14 byte[] pdfFile = new byte[get_file.Length];
15 get_file.Read(pdfFile, 0, (int)get_file.Length);//将文件流读取到Buffer中
16 get_file.Close();
17
18 string result = MD5Buffer(pdfFile, 0, pdfFile.Length );//对Buffer中的字节内容算MD5
19 result = MD5String(result +key);//这儿点的key相当于一个密钥,这样一般人就是知道使用MD5算法,但是若不知道这个字符串还是无法计算出正确的MD5
20
21 byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result);//将字符串转换成字节数组以便写人到文件中
22
23 FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
24 fsWrite.Write(pdfFile, 0, pdfFile.Length);//将pdf文件,MD5值 重新写入到文件中。
25 fsWrite.Write(md5, 0, md5.Length);
26 //fsWrite.Write(pdfFile, 10, pdfFile.Length - 10);
27 fsWrite.Close();
28
29 return result;
30 }
31 catch (Exception e)
32 {
33 return e.ToString();
34 }
35 }
36 /**////
37 /// 对给定路径的文件进行验证
38 ///

39 ///
40 /// 是否加了标签或是否标签值与内容值一致
41 public static bool Check(string path,string key)
42 {
43 try
44 {
45 FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
46
47
48 byte[] pdfFile = new byte[get_file.Length];
49 get_file.Read(pdfFile, 0, (int)get_file.Length);
50 get_file.Close();
51 string result = MD5Buffer(pdfFile, 0, pdfFile.Length - 32);//对pdf文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。
52 result = MD5String(result + key);
53
54 string md5 = System.Text.Encoding.ASCII.GetString(pdfFile, pdfFile.Length - 32, 32);//读取pdf文件最后32位,其中保存的就是MD5值
55 return result == md5;
56 }
57 catch
58 {
59
60 return false;
61
62 }
63 }
64 private static string MD5Buffer(byte[] pdfFile, int index, int count)
65 {
66 System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
67 byte[] hash_byte = get_md5.ComputeHash(pdfFile, index, count);
68
69 string result = System.BitConverter.ToString(hash_byte);
70 result = result.Replace("-", "");
71 return result;
72 }
73 private static string MD5String(string str)
74 {
75 byte[] MD5Source = System.Text.Encoding.ASCII.GetBytes(str);
76 return MD5Buffer(MD5Source, 0, MD5Source.Length);
77
78 }
79 }
以上代码不仅仅只适用于PDF文件,对于其他一些格式也可以用,这主要是取决于文件的格式规范。


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.