[C#.NET] 如何 使用 HashAlgorithm 類別 / 雜湊驗証檔案是否有被修改

  • 15865
  • 0
  • C#
  • 2013-07-05

[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);
}

2009-8-11 上午 12-04-43  

如何取得檔案的雜湊值

//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);
        }
    }
}

實作過程:

 

範例下載:

CS_HashAlgorithm.rar

VB_HashAlgorithm.rar

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo