博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件校验工具的开发及问题
阅读量:4563 次
发布时间:2019-06-08

本文共 3424 字,大约阅读时间需要 11 分钟。

文件校验工具的开发及问题

1.加密算法的熟悉

    现在文件校验使用较多的是校验文件的MD5值和SHA1值,有些使用的还有CRC32,前些天微软发布了VisualStudio正式版,win10镜像,微软官方给出的校验方式都是校验文件的SHA1值

       

 

2.文件的加密计算

知道了如何进行普通字符串的加密还不够,我们要校验的文件的MD5值或SHA1值,接下来熟悉如何获取文件的MD5值和SHA1值

 

  • 获取文件的MD5值

    

1         public static string GetFileMD5(string filePath) 2         { 3             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 4             FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 5             byte[] result = md5.ComputeHash(fs); 6             md5.Clear(); 7             StringBuilder sb = new StringBuilder(32); 8             for (int i = 0; i < result.Length; i++) 9             {10                 sb.Append(result[i].ToString("X2"));11             }12             return sb.ToString();13         }

 

 

 

  • 获取文件的SHA1值

 

1         public static string GetFileSHA1(string filePath) 2         { 3             SHA1 sha1 = new SHA1CryptoServiceProvider(); 4             FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 5             byte[] result = sha1.ComputeHash(fs); 6             sha1.Clear(); 7             StringBuilder sb = new StringBuilder(32); 8             for (int i = 0; i < result.Length; i++) 9             {10                 sb.Append(result[i].ToString("X2"));11             }12             return sb.ToString();13         }

 

 

 

 

3.文件加密数据结构优化

这么多方法,有许多方法大多数代码还都是重复的,如何让代码更精简呢?重构,提高代码的复用率,最初想的是建一个基类,其他各种具体实现都在继承它,但又觉得好麻烦,要新建好几个类,最终决定,建一个类,用最简单的重构,封装方法。

最终加密帮助类实现代码如下:

 

 

1     public static class ValidHelper 2     { 3         public static string GetFileHash(string filePath, HashAlgorithm algorithm) 4         { 5             FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 6             byte[] result = algorithm.ComputeHash(fs); 7             algorithm.Clear(); 8             StringBuilder sb = new StringBuilder(32); 9             for (int i = 0; i < result.Length; i++)10             {11                 sb.Append(result[i].ToString("X2"));12             }13             return sb.ToString();14         }15 16         public static string GetFileMD5(string filePath)17         {18             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();19             return GetFileHash(filePath, md5);20         }21 22         public static string GetFileSHA1(string filePath)23         {24             SHA1 sha1 = new SHA1CryptoServiceProvider();25             return GetFileHash(filePath, sha1);26         }27 28         public static string GetFileSHA256(string filePath)29         {30             SHA256 sha256 = SHA256.Create();31             return GetFileHash(filePath, sha256);32         }33 34         public static string GetFileSHA384(string filePath)35         {36             SHA384 sha384 = SHA384.Create();37             return GetFileHash(filePath, sha384);38         }39 40         public static string GetFileSHA512(string filePath)41         {42             SHA512 sha512 = SHA512.Create();43             return GetFileHash(filePath, sha512);44         }45     }

 

4.完成后测试与分析

代码完成之后便是测试,在网上找一个文件校验工具(使用的软媒魔方里的校验工具),进行比对,看自己的校验工具是否与软媒魔方的校验工具的校验结果是否一致,经校验,没有错误,最初测试的小文件,后来下载了一个win10系统,使用自己的校验工具,校验是否和微软官方给出的SHA1值一致时,小工具直接卡死了,过了好长时间才出来结果,这说明这个小工具还待优化,尤其是处理大文件。

在网上查找资料,看到有这样的实现思路,将文件在内存中的位置分段,比如说分成5段,分5个线程同时开始计算,最后将5个计算值再经过处理得到整个文件的SHA1值或MD5值。然而愚钝,不知道该如何实现,望大神看到之后能给予一些指导,万分感谢。

 

转载于:https://www.cnblogs.com/weihanli/p/fileValidToolDev.html

你可能感兴趣的文章
美团网2014-9-26专访(侧长沙)
查看>>
HTML 5 History API的”前生今世”
查看>>
协方差的意义
查看>>
优先队列实现 大小根堆 解决top k 问题
查看>>
C语言中的字符串分割函数
查看>>
添加网络位置的问题
查看>>
3-Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)...
查看>>
数据库中GETDATE()函数格式化时间
查看>>
堆排序算法的java实现
查看>>
is a 关系 和 has a 关系
查看>>
排序算法之---数据结构实训
查看>>
bzoj1088: [SCOI2005]扫雷Mine
查看>>
进程:程序执行的基本模型
查看>>
树状数组详解(转)
查看>>
CF295A
查看>>
原生js实现Ajax
查看>>
Requests的基础学习
查看>>
机器学习理论基础
查看>>
Sprint第一个冲刺(第一天)
查看>>
AngularJS之ng-class(十一)
查看>>