[C#.NET] 如果使用 HashAlgorithm 類別 / 雜湊驗証檔案是否有被修改
1.HashAlgorithm 類別 提供我們兩種Hash演算法包含了SHA1、SHA256、SHA384、SHA512、MD5。
2.HashAlgorithm 類別 可以用來驗証檔案是否有被修改過。
3.只要有修改過檔案內容就會產生不可預期的雜湊值變化,如果在網路上下載一個檔案,通常都會附上該檔案的MD5驗証碼,那就是要來驗証檔案是否被有心人士修改過,以確保檔案是安全的。
4.我們可以不用知道雜湊演算法,只要會用就好了,下面範例需匯入 System.Security.Cryptography 命名空間
如何取得字串的雜湊
Step1.選擇加密類型,comboBox1有SHA1及MD5兩種
string myHashName = this.comboBox1.SelectedItem.ToString();
Step2.選擇加密檔案(或字串)
string MyPassword = this.textBox1.Text;
Step3.建立HashAlgorithm類別
HashAlgorithm ha = HashAlgorithm.Create(myHashName)
Step4.檔案傳成byte陣列
byte[] pwData = Encoding.Default.GetBytes(MyPassword);
Step5.產生加密的Code
byte[] myHash = ha.ComputeHash(pwData);
Step6.顯示雜湊值,以下提供了兩種顯示的方式,一種有”-“符號另外一種沒有
//法一:
this.textBox2.Text = BitConverter.ToString(myHash);
//法二:
//依檔案建立空字串
StringBuilder NewHashCode = new StringBuilder(myHash.Length);
//轉換成加密的Code
foreach (byte AddByte in myHash)
{
NewHashCode.AppendFormat("{0:X2}", AddByte);
}
如何取得檔案的雜湊值
//1.選擇加密類型
string myHashName = "SHA1";
//2.選擇加密檔案
String myFile = Application.StartupPath + "\\boot.txt";
//若檔案不存在則離開
if (!File.Exists(myFile))
{
return;
}
//3.建立HashAlgorithm類別
using (HashAlgorithm ha = HashAlgorithm.Create(myHashName))
{
//4.開啟檔案
using (Stream myStream = new FileStream(myFile, FileMode.Open))
{
//5.產生加密的Code
byte[] myHash = ha.ComputeHash(myStream);
//6.顯示雜湊值
//法一:
this.textBox2.Text = BitConverter.ToString(myHash);
//法二:
//依檔案建立空字串
StringBuilder NewHashCode = new StringBuilder(myHash.Length);
//轉換成加密的Code
foreach (byte AddByte in myHash)
{
NewHashCode.AppendFormat("{0:X2}", AddByte);
}
this.textBox3.Text = NewHashCode.ToString();
}
}
如何比對雜湊值,這範例是延續應用,用法都與上述相同,只是要先知道檔案原本的雜湊值,比對即可;可以試著修改檔案內容觀察其雜湊值。
//1.選擇加密類型
string myHashName = "SHA1";
//2.選擇加密檔案
String myFile = Application.StartupPath + "\\boot.txt";
//若檔案不存在則離開
if (!File.Exists(myFile))
{
return;
}
//3.定義加密的Code(事先就要知道)
string OldHashCode = textBox4.Text;
//4.建立HashAlgorithm類別
using (HashAlgorithm ha = HashAlgorithm.Create(myHashName))
{
//5.開啟檔案
using (Stream myStream = new FileStream(myFile, FileMode.Open))
{
//6.產生加密的Code
byte[] myHash = ha.ComputeHash(myStream);
//7.依檔案建立空字串
StringBuilder NewHashCode = new StringBuilder(myHash.Length);
//8.轉換成加密的Code
foreach (byte AddByte in myHash)
{
NewHashCode.AppendFormat("{0:X2}", AddByte);
}
if (OldHashCode == NewHashCode.ToString())
{
textBox5.Text = NewHashCode.ToString();
}
else
{
textBox5.Text = NewHashCode.ToString();
//修改檔案內容會有不同的Code
MessageBox.Show("雜湊值不相等,文件內容已被修改", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
實作過程:
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET