public string GetMD5(string input, string salt = "")
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
byte[] data = Encoding.UTF8.GetBytes(salt + input);
byte[] hash = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
foreach (byte b in hash)
sb.Append(b.ToString("x2")); // 雙位十六進制
return sb.ToString();
}
}
// 使用
string hash = GetMD5("123456");
// 結果: e10adc3949ba59abbe56e057f20f883e
MD5CryptoServiceProvider 非託管資源0F 而非 F)salt + input 防彩虹表攻擊,鹽值應隨機生成並存儲MD5 已不適合安全敏感場景(密碼存儲、簽名驗證):
- 碰撞攻擊可行(2004 年王小雲團隊破解)
- 無鹽值極易被彩虹表逆推
- 計算速度極快,利於暴力破解
替代方案:
- 密碼存儲:
PBKDF2、bcrypt、scrypt、Argon2(慢哈希 + 自帶鹽值)- 完整性驗證:
SHA-256、SHA-3、HMAC-SHA256- 數字簽名:
RSA、ECDSA、Ed25519
本文提供標準、可生產使用的 MD5 實現代碼,並嚴正說明其安全局限性。現代 .NET 開發中,密碼存儲請務必使用 PBKDF2/Argon2 等慢哈希算法,MD5 僅限非安全敏感場景。