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

 

參考資料:

MD5

MD5測試果然發生碰撞,心情真複雜

MD5 類別

[C#] 使用MD5、SHA-1、SHA-2(SHA-256、SHA-384、SHA-512) 加密資料

Base64

SHA家族