文件校驗工具的開發及問題
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值。然而愚鈍,不知道該如何實現,望大神看到之後能給予一些指導,萬分感謝。
文件校驗工具下載