文件校驗工具的開發及問題
1.加密算法的熟悉
現在文件校驗使用較多的是校驗文件的MD5值和SHA1值,有些使用的還有CRC32,前些天微軟發布了VisualStudio正式版,win10鏡像,微軟官方給出的校驗方式都是校驗文件的SHA1值
C#進行MD5加密與SHA加密的實現總結在這裡
2.文件的加密計算
知道了如何進行普通字符串的加密還不夠,我們要校驗的文件的MD5值或SHA1值,接下來熟悉如何獲取文件的MD5值和SHA1值
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 }
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值。然而愚鈍,不知道該如何實現,望大神看到之後能給予一些指導,萬分感謝。
文件校驗工具下載