詳細(xì)介紹C#之文件校驗(yàn)工具的開發(fā)及問題
.加密算法的熟悉
目前校驗(yàn)文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段時(shí)間微軟發(fā)布了VisualStudio正式版,win鏡像,微軟官方給出的校驗(yàn)方式都是校驗(yàn)文件的SHA值。
C#進(jìn)行MD加密與SHA加密的實(shí)現(xiàn)總結(jié)在這里
.文件的加密計(jì)算
知道了如何進(jìn)行普通字符串的加密還不夠,我們要校驗(yàn)的文件的MD值或SHA值,接下來熟悉如何獲取文件的MD值和SHA值
獲取文件的MD值
public static string GetFileMD(string filePath) { MDCryptoServiceProvider md = new MDCryptoServiceProvider(); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] result = md.ComputeHash(fs); md.Clear(); StringBuilder sb = new StringBuilder(); for (int i = ; i < result.Length; i++) { sb.Append(result[i].ToString("X")); } return sb.ToString(); }
獲取文件的SHA值
public static string GetFileSHA(string filePath) { SHA sha = new SHACryptoServiceProvider(); FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] result = sha.ComputeHash(fs); sha.Clear(); StringBuilder sb = new StringBuilder(); for (int i = ; i < result.Length; i++) { sb.Append(result[i].ToString("X")); } return sb.ToString(); }
.文件加密數(shù)據(jù)結(jié)構(gòu)優(yōu)化
這么多方法,有許多方法大多數(shù)代碼還都是重復(fù)的,如何讓代碼更精簡呢?重構(gòu),提高代碼的復(fù)用率,最初想的是建一個(gè)基類,其他各種具體實(shí)現(xiàn)都在繼承它,但又覺得好麻煩,要新建好幾個(gè)類,最終決定,建一個(gè)類,用最簡單的重構(gòu),封裝方法。
最終加密幫助類實(shí)現(xiàn)代碼如下:
public static class ValidHelper { public static string GetFileHash(string filePath, HashAlgorithm algorithm) { FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] result = algorithm.ComputeHash(fs); algorithm.Clear(); StringBuilder sb = new StringBuilder(); for (int i = ; i < result.Length; i++) { sb.Append(result[i].ToString("X")); } return sb.ToString(); } public static string GetFileMD(string filePath) { MDCryptoServiceProvider md = new MDCryptoServiceProvider(); return GetFileHash(filePath, md); } public static string GetFileSHA(string filePath) { SHA sha = new SHACryptoServiceProvider(); return GetFileHash(filePath, sha); } public static string GetFileSHA(string filePath) { SHA sha = SHA.Create(); return GetFileHash(filePath, sha); } public static string GetFileSHA(string filePath) { SHA sha = SHA.Create(); return GetFileHash(filePath, sha); } public static string GetFileSHA(string filePath) { SHA sha = SHA.Create(); return GetFileHash(filePath, sha); } }
.完成后測試與分析
代碼完成之后便是測試,在網(wǎng)上找一個(gè)文件校驗(yàn)工具(使用的軟媒魔方里的校驗(yàn)工具),進(jìn)行比對,看自己的校驗(yàn)工具是否與軟媒魔方的校驗(yàn)工具的校驗(yàn)結(jié)果是否一致,經(jīng)校驗(yàn),沒有錯(cuò)誤,最初測試的小文件,后來下載了一個(gè)win系統(tǒng),使用自己的校驗(yàn)工具,校驗(yàn)是否和微軟官方給出的SHA值一致時(shí),小工具直接卡死了,過了好長時(shí)間才出來結(jié)果,這說明這個(gè)小工具還待優(yōu)化,尤其是處理大文件。
在網(wǎng)上查找資料,看到有這樣的實(shí)現(xiàn)思路,將文件在內(nèi)存中的位置分段,比如說分成段,分個(gè)線程同時(shí)開始計(jì)算,最后將個(gè)計(jì)算值再經(jīng)過處理得到整個(gè)文件的SHA值或MD值。然而愚鈍,不知道該如何實(shí)現(xiàn),望大神看到之后能給予一些指導(dǎo),萬分感謝。
以上介紹就是本文的全部內(nèi)容,希望大家喜歡。
- C++計(jì)算ICMP頭的校驗(yàn)和實(shí)例
- python和shell實(shí)現(xiàn)的校驗(yàn)IP地址合法性腳本分享
- 微信公眾平臺(tái)消息接口校驗(yàn)與消息接口響應(yīng)實(shí)例
- 零基礎(chǔ)學(xué)習(xí)AJAX之制作自動(dòng)校驗(yàn)的表單
- Symfony數(shù)據(jù)校驗(yàn)方法實(shí)例分析
- php校驗(yàn)表單檢測字段是否為空的方法
- Codeigniter校驗(yàn)ip地址的方法
- PHP實(shí)現(xiàn)通過Luhn算法校驗(yàn)信用卡卡號(hào)是否有效
- JavaScript實(shí)現(xiàn)信用卡校驗(yàn)方法
相關(guān)文章
C# 實(shí)現(xiàn)Trim方法去除字符串前后的所有空格
這篇文章主要介紹了C# 實(shí)現(xiàn)Trim方法去除字符串前后的所有空格,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)txt定位指定行的方法,涉及C#針對文本文件進(jìn)行光標(biāo)定位的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08c# SqlDataAdapter中的Fill是怎么實(shí)現(xiàn)的
這篇文章主要介紹了c# SqlDataAdapter中的Fill是怎么實(shí)現(xiàn)的,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07c#多線程中Lock()關(guān)鍵字的用法小結(jié)
本篇文章主要是對c#多線程中Lock()關(guān)鍵字的用法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01