MD5 訊息摘要演算法 Message-Digest Algorithm
MD5是個密碼雜湊函式,可以產生出一個128位元的雜湊值,
雖然MD5無法完全防止碰撞(不同的訊息卻產生出相同的雜湊值),
但因其普遍、穩定、快速的特點,他常常被應用在檔案傳輸可靠性方面,例如,
使用者會將所下載的檔案經過MD5所算出的雜湊值去跟開發者所提供的雜湊值做比對,
如果一樣則表示檔案沒被竄改可信任,如果不一樣則檔案已被竄改過。
既然MD5已被證實存在弱點可以被加以破解,但為什麼現在還有那麼多人還在用MD5呢?答案是,視應用場合而訂。
如果把MD5技術用來做Primary Key則是不安全的,雖然MD5的雜湊值有128位元,
也就是說最多可產生2^128種Key值組合,假設你的Key值會用超過2^128個,
那將無可避免碰撞發生。
但是用在檔案傳輸驗證方面就很適合了,原始檔案所產生出的雜湊值是2^128組合的其中一個,
如果有黑客想竄改檔案勢必經過MD5所產生出的雜湊值一定要跟原始檔案的雜湊值一模一樣,
會不會剛剛好竄改檔案跟原始檔案的雜湊值是一模一樣的呢?有可能的,但是,機率為2^128分之一,
這是什麼感覺?2^128約為十進制的3.4*10^38,而一兆這數目為10^12,這下有感覺了吧,
竄改檔案要賭2^128分之一的機率會中,我想不會有人要這樣硬玩的。
一個簡單的 MD5 範例請參考
using System;
using System.Text;
using System.Security.Cryptography;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
MD5 md5 = MD5.Create(); //建立一個MD5
byte[] source = Encoding.Default.GetBytes("abcdefg");
byte[] crypto = md5.ComputeHash(source); //產生MD5雜湊值
string resultBase64 = Convert.ToBase64String(crypto); //將雜湊值使用Base64來表示
string resultHex = BitConverter.ToString(crypto);
Console.WriteLine("Base64格式的雜湊值:" + resultBase64);
Console.WriteLine("16進制格式的雜湊值:" + resultHex);
Console.ReadKey();
}
}
}
一個簡單的 SHA256 範例請參考
using System;
using System.Text;
using System.Security.Cryptography;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
SHA256 sha256 = new SHA256CryptoServiceProvider();//建立一個SHA256
byte[] source = Encoding.Default.GetBytes("abcdefg");//將字串轉為Byte[]
byte[] crypto = sha256.ComputeHash(source);//產生SHA256雜湊值
string resultBase64 = Convert.ToBase64String(crypto);//把加密後的字串(雜湊值)使用Base64來表示
string resultHex = BitConverter.ToString(crypto);
Console.WriteLine("Base64格式的SHA256加密雜湊值:" + resultBase64);
Console.WriteLine("16進制格式的SHA256加密雜湊值:" + resultHex);
Console.ReadKey();
}
}
}
參考資料: