程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 文件校驗工具的開發及問題,校驗工具開發

文件校驗工具的開發及問題,校驗工具開發

編輯:C#入門知識

文件校驗工具的開發及問題,校驗工具開發


文件校驗工具的開發及問題

1.加密算法的熟悉

    現在文件校驗使用較多的是校驗文件的MD5值和SHA1值,有些使用的還有CRC32,前些天微軟發布了VisualStudio正式版,win10鏡像,微軟官方給出的校驗方式都是校驗文件的SHA1值

       C#進行MD5加密與SHA加密的實現總結在這裡

 

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值。然而愚鈍,不知道該如何實現,望大神看到之後能給予一些指導,萬分感謝。

 

文件校驗工具下載

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved