資安防護中,雜湊演算法常用於密碼儲存、資料完整性驗證、簽名驗證。ASP.NET 透過 System.Security.Cryptography 與 System.Web.Security.FormsAuthentication 提供多種演算法支援。本文整理 MD5、SHA1 核心概念、三種呼叫方式與選型建議。
| 演算法 | 全名 | 雜湊長度 | 可逆性 | 現代安全性評級 |
|---|---|---|---|---|
| MD5 | Message-Digest Algorithm 5 | 128 bits (32 Hex) | 不可逆 | 已破解 (碰撞攻擊),不建議用於新系統敏感資料 |
| SHA1 | Secure Hash Algorithm 1 | 160 bits (40 Hex) | 不可逆 | 已淘汰 (SHAttered 碰撞攻擊),TLS/憑證已禁用 |
| SHA256 | Secure Hash Algorithm 256 | 256 bits (64 Hex) | 不可逆 | 推薦 目前主流標準 |
| PBKDF2 / bcrypt / Argon2 | 金鑰衍生 / 密碼雜湊 | 可配置 | 單向 + 慢速運算 | 密碼儲存首選 (抗暴力破解) |
MD5 (抽象基類)、MD5CryptoServiceProvider (具體實作)、FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5") (簡易靜態方法)。SHA1、SHA1CryptoServiceProvider、FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1")。SHA256Managed、HMACSHA256 或 Rfc2898DeriveBytes (PBKDF2)。public string GetMd5_V1(string input)
{
using (MD5 md5 = new MD5CryptoServiceProvider())
{
byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(input)); // 注意編碼一致性
// BitConverter 輸出含 "-" 分隔符,取 9-25 字元 (16 bytes) 或完整 32 字元
return BitConverter.ToString(hash, 4, 8).Replace("-", ""); // 範例取中間 16 字元
// return BitConverter.ToString(hash).Replace("-", ""); // 完整 32 字元
}
}
public string GetMd5_V2(string input)
{
using (MD5 md5 = MD5.Create()) // 自動選擇最佳實作
{
byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); // 建議統一 UTF-8
StringBuilder sb = new StringBuilder();
foreach (byte b in hash) sb.Append(b.ToString("X2")); // 大寫十六進位,無分隔符
return sb.ToString();
}
}
public string GetMd5_V3(string input)
{
// 回傳標準 32 字元大寫 Hex (相容舊系統)
return FormsAuthentication.HashPasswordForStoringInConfigFile(input, "MD5");
}
Rfc2898DeriveBytes (PBKDF2)、BCrypt.Net-Next 或 Argon2 庫,並儲存 Salt + Hash + 迭代次數。Encoding.UTF8 是跨平台安全選擇,避免 Encoding.Default 隨作業系統變化導致驗證失敗。CryptographicOperations.FixedTimeEquals),防止側通道攻擊。需要儲存使用者密碼?
├─ 是 → 使用 PBKDF2 (Rfc2898DeriveBytes) / bcrypt / Argon2 + 隨機 Salt + 高迭代/記憶體成本
└─ 否
├─ 需資料完整性驗證 (非機密) → SHA256 / HMACSHA256 (含金鑰)
├─ 需數位簽章 → RSA/ECDSA + SHA256
└─ 相容舊系統 (MD5/SHA1) → 僅限非安全用途 (如快取 Key、非敏感 ID),並規劃遷移路線圖
結論: 了解 MD5/SHA1 呼叫方式有助維護舊系統,**新專案請直接採用 SHA256 以上與專用密碼雜湊演算法**,並在傳輸與儲存全鏈路落實加密與存取控制。