項目總結-MD5的使用
MD5算法是一種散列(hash)算法(摘要算法,指紋算法),不是一種加密算法。任何長度的任意內容都可以用MD5計算出散列值。
MD5長度一般是32位的16進制數字符串。
理論上,MD5值的個數是有限的,但是源數據是無限的,因此存在著不同的內容產生相同MD5值的概率。因此MD5算法不可逆,也就是只能得到內容對應的MD5值,無法由MD5值反推內容。但是對不同的內容產生相同MD5值的概率非常非常非常低!
MD5算法理論上是不可逆的,因此***的唯一辦法就是碰撞。
1)使用MD5進行對字符串的操作,具體代碼實現:
using System.Security.Cryptography;//需要導入這個命名空間
......
static void Main(string[] args)
{
Console.WriteLine("請輸入字符串,使用MD5加密 ...");
string str = Console.ReadLine();
string md5 = Md5ChuLiStr(str);
Console.WriteLine(md5);
Console.ReadKey();
}
private static string Md5ChuLiStr(string msg)
{
//1.創建一個MD5對象
MD5 md5 = MD5.Create();
//2.把字符串變為一個byte數組
//對于中文或者某些字符,采用不同的編碼生成的byte[]是不一樣的,
//所以造成了采用不同編碼生成的md5值不一樣的情況。
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
//3.將一個byte[]通過MD5計算得到一個新的byte[],新的byte[]就是計算md5后的結果。
byte[] md5Buffer = md5.ComputeHash(buffer);
//釋放資源
md5.Clear();
//4.將計算后的結果直接顯示為字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < md5Buffer.Length; i++)
{
//x2:把每個數字轉換為16進制,并保留兩位數字。
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();
}
......
2)使用MD5進行對文件的操作,具體代碼實現:
using System.Security.Cryptography;//需要導入這個命名空間
using System.IO;//需要用到文件流等
...
static void Main(string[] args)
{
Console.WriteLine("請輸入文件路徑,使用MD5加密 ...");
string path = Console.ReadLine();
string md5 = Md5ChuLiFile(path);
Console.WriteLine(md5);
Console.ReadKey();
}
private static string Md5ChuLiFile (string path)
{
MD5 md5 = MD5.Create();
using (FileStream fs = File.OpenRead(path))
{
byte[] md5Buffer = md5.ComputeHash(fs);//這里直接傳入文件流對象
md5.Clear();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < md5Buffer.Length; i++)
{
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();
}
}
......
*:最后,產生的MD5值可以通過MD5計算器(CalcMD5.exe)進行對照。