Hash MD5 CRC 知识
本文旨在科普安全相關的知識,并附一個C#實現的文件管理工具。
Hash
安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數家族,是FIPS所認證的五種安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的概率很高。這些算法之所以稱作“安全”是基于以下兩點(根據官方標準的描述):
HASH是根據文件的內容的數據通過邏輯運算得到的數值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的, 所以HASH值就成了每一個文件的身份證。
不同HASH值的文件內容也是不相同的,相同的HASH值的文件的內容肯定是完全相同(即使文件名不同).
HASH值還有文件校驗的功能,相當于文件的校驗碼. 所以還可以用來檢查文件下載是否正確(比如我們在下載系統鏡像或其它開源軟件時,官網都會提供文件的HASH值,讓我們通過對比HASH值來判斷文件是否被修改過)。
文件的Hash值在下載文件的校驗方面有很大的用途,Hash值是文件內容的通過二進制碼進行一系列的變換生成出來的,即使文件名發生變化,Hash的值也不會發生改變。因此在開發的過程中一般比較兩個文件是否相同都是去比較兩個文件的Hash值。
?
MD5
英文全稱Message-Digest Algorithm(消息摘要算法)
在下載一下東西時,經常在一些壓縮包屬性里,看到md5值。而且這個下載頁面,很可能會在某一個地方,寫了一句,此文件的MD5值為XXXXXXXXX。這有什么作用呢?
白話白話:md5,其實就是一中算法。可以將一個字符串,或文件,或壓縮包,執行md5后,就可以生成一個固定長度為128bit的串。這個串,基本上是唯一的。
所以,有人修過壓縮包后,就會生成新的串,這時就可以拿網站提供的串和新生成的串對比,如果不同,那就是被人修過過了。
更多請查看:https://zh.wikipedia.org/wiki/MD5 / http://www.weixuehao.com/archives/474
?
CRC
循環冗余校驗(英語:Cyclic redundancy check,通稱“CRC”)是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。生成的數字在傳輸或者存儲之前計算出來并且附加到數據后面,然后接收方進行檢驗確定數據是否發生變化。一般來說,循環冗余校驗的值都是32位的整數。由于本函數易于用二進制的電腦硬件使用、容易進行數學分析并且尤其善于檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。此方是由W. Wesley Peterson于1961年發表
?
HashHelper
下面一個C#版本的工具類,主要功能是計算文件Hash,文件MD5,文件的CRC32
using System; using System.IO; using System.Text;/// <summary> /// 提供用于計算指定文件哈希值的方法 /// <example>例如計算文件的MD5值: /// <code> /// String hashMd5=HashHelper.GetMD5("MyFile.txt"); /// </code> /// </example> /// <example>例如計算文件的CRC32值: /// <code> /// String hashCrc32 = HashHelper.GetCRC32("MyFile.txt"); /// </code> /// </example> /// <example>例如計算文件的SHA1值: /// <code> /// String hashSha1 =HashHelper.GetSHA1("MyFile.txt"); /// </code> /// </example> /// </summary> public class HashHelper {/// <summary>/// 計算指定文件的MD5值/// </summary>/// <param name="fileName">指定文件的完全限定名稱</param>/// <returns>返回值的字符串形式</returns>public static String GetMD5(String fileName){String hashMD5 = String.Empty;//檢查文件是否存在,如果文件存在則進行計算,否則返回空值if (File.Exists(fileName)){using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//計算文件的MD5值System.Security.Cryptography.MD5 calculator = System.Security.Cryptography.MD5.Create();Byte[] buffer = calculator.ComputeHash(fs);calculator.Clear();//將字節數組轉換成十六進制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < buffer.Length; i++){stringBuilder.Append(buffer[i].ToString("x2"));}hashMD5 = stringBuilder.ToString();}//關閉文件流}//結束計算return hashMD5;}//ComputeMD5/// <summary>/// 計算指定文件的CRC32值/// </summary>/// <param name="fileName">指定文件的完全限定名稱</param>/// <returns>返回值的字符串形式</returns>public static String GetCRC32(String fileName){String hashCRC32 = String.Empty;//檢查文件是否存在,如果文件存在則進行計算,否則返回空值if (File.Exists(fileName)){using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//計算文件的CSC32值Crc32 calculator = new Crc32();Byte[] buffer = calculator.ComputeHash(fs);calculator.Clear();//將字節數組轉換成十六進制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < buffer.Length; i++){stringBuilder.Append(buffer[i].ToString("x2"));}hashCRC32 = stringBuilder.ToString();}//關閉文件流 }return hashCRC32;}//ComputeCRC32/// <summary>/// 獲取文件的SHA1/// </summary>/// <param name="fileName"></param>/// <returns></returns>public static String GetSHA1(String fileName){String hashSHA1 = String.Empty;//檢查文件是否存在,如果文件存在則進行計算,否則返回空值if (File.Exists(fileName)){using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)){//計算文件的SHA1值System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();Byte[] buffer = calculator.ComputeHash(fileStream);calculator.Clear();//將字節數組轉換成十六進制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int bufferIdx = 0; bufferIdx < buffer.Length; bufferIdx++){stringBuilder.Append(buffer[bufferIdx].ToString("x2"));}hashSHA1 = stringBuilder.ToString();}//關閉文件流 }else{Console.Error.WriteLine("{0}文件找不到!", fileName);}return hashSHA1;}//end GetSHA1 }/// <summary> /// 提供 CRC32 算法的實現 /// </summary> public class Crc32 : System.Security.Cryptography.HashAlgorithm {public const UInt32 DefaultPolynomial = 0xedb88320;public const UInt32 DefaultSeed = 0xffffffff;private UInt32 hash;private UInt32 seed;private UInt32[] table;private static UInt32[] defaultTable;public Crc32(){table = InitializeTable(DefaultPolynomial);seed = DefaultSeed;Initialize();}public Crc32(UInt32 polynomial, UInt32 seed){table = InitializeTable(polynomial);this.seed = seed;Initialize();}public override void Initialize(){hash = seed;}protected override void HashCore(byte[] buffer, int start, int length){hash = CalculateHash(table, hash, buffer, start, length);}protected override byte[] HashFinal(){byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);this.HashValue = hashBuffer;return hashBuffer;}public static UInt32 Compute(byte[] buffer){return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, 0, buffer.Length);}public static UInt32 Compute(UInt32 seed, byte[] buffer){return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, 0, buffer.Length);}public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer){return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length);}private static UInt32[] InitializeTable(UInt32 polynomial){if (polynomial == DefaultPolynomial && defaultTable != null){return defaultTable;}UInt32[] createTable = new UInt32[256];for (int i = 0; i < 256; i++){UInt32 entry = (UInt32)i;for (int j = 0; j < 8; j++){if ((entry & 1) == 1)entry = (entry >> 1) ^ polynomial;elseentry = entry >> 1;}createTable[i] = entry;}if (polynomial == DefaultPolynomial){defaultTable = createTable;}return createTable;}private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size){UInt32 crc = seed;for (int i = start; i < size; i++){unchecked{crc = (crc >> 8) ^ table[buffer[i] ^ crc & 0xff];}}return crc;}private byte[] UInt32ToBigEndianBytes(UInt32 x){return new byte[] { (byte)((x >> 24) & 0xff), (byte)((x >> 16) & 0xff), (byte)((x >> 8) & 0xff), (byte)(x & 0xff) };} }//end class: Crc32總結
以上是生活随笔為你收集整理的Hash MD5 CRC 知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打开Delphi 10.1 berlin
- 下一篇: 苹果开发(二) 申请应用