首页 > 编程 > C# > 正文

详细介绍C#之文件校验工具的开发及问题

2019-10-29 21:39:37
字体:
来源:转载
供稿:网友

目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的SHA值。下面详细介绍C#之文件校验工具的开发及问题,需要的朋友可以参考下

.加密算法的熟悉

目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的SHA值。

C#进行MD加密与SHA加密的实现总结在这里

.文件的加密计算

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

获取文件的MD值

 

 
  1. public static string GetFileMD(string filePath) 
  2. MDCryptoServiceProvider md = new MDCryptoServiceProvider(); 
  3. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 
  4. byte[] result = md.ComputeHash(fs); 
  5. md.Clear(); 
  6. StringBuilder sb = new StringBuilder(); 
  7. for (int i = ; i < result.Length; i++) 
  8. sb.Append(result[i].ToString("X")); 
  9. return sb.ToString(); 

获取文件的SHA值

 

 
  1. public static string GetFileSHA(string filePath) 
  2. SHA sha = new SHACryptoServiceProvider(); 
  3. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 
  4. byte[] result = sha.ComputeHash(fs); 
  5. sha.Clear(); 
  6. StringBuilder sb = new StringBuilder(); 
  7. for (int i = ; i < result.Length; i++) 
  8. sb.Append(result[i].ToString("X")); 
  9. return sb.ToString(); 

.文件加密数据结构优化

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

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

 

 
  1. public static class ValidHelper 
  2. public static string GetFileHash(string filePath, HashAlgorithm algorithm) 
  3. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); 
  4. byte[] result = algorithm.ComputeHash(fs); 
  5. algorithm.Clear(); 
  6. StringBuilder sb = new StringBuilder(); 
  7. for (int i = ; i < result.Length; i++) 
  8. sb.Append(result[i].ToString("X")); 
  9. return sb.ToString(); 
  10.  
  11. public static string GetFileMD(string filePath) 
  12. MDCryptoServiceProvider md = new MDCryptoServiceProvider(); 
  13. return GetFileHash(filePath, md); 
  14.  
  15. public static string GetFileSHA(string filePath) 
  16. SHA sha = new SHACryptoServiceProvider(); 
  17. return GetFileHash(filePath, sha); 
  18.  
  19. public static string GetFileSHA(string filePath) 
  20. SHA sha = SHA.Create(); 
  21. return GetFileHash(filePath, sha); 
  22.  
  23. public static string GetFileSHA(string filePath) 
  24. SHA sha = SHA.Create(); 
  25. return GetFileHash(filePath, sha); 
  26.  
  27. public static string GetFileSHA(string filePath) 
  28. SHA sha = SHA.Create(); 
  29. return GetFileHash(filePath, sha); 

.完成后测试与分析

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

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

以上介绍就是本文的全部内容,希望大家喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表