首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 常見加密演算法總覽:MD5、SHA1 實作與安全性選型指南

     編輯:關於ASP.NET

資安防護中,雜湊演算法常用於密碼儲存、資料完整性驗證、簽名驗證。ASP.NET 透過 System.Security.Cryptography 與 System.Web.Security.FormsAuthentication 提供多種演算法支援。本文整理 MD5、SHA1 核心概念、三種呼叫方式與選型建議。

核心概念速查

演算法全名雜湊長度可逆性現代安全性評級
MD5Message-Digest Algorithm 5128 bits (32 Hex)不可逆已破解 (碰撞攻擊),不建議用於新系統敏感資料
SHA1Secure Hash Algorithm 1160 bits (40 Hex)不可逆已淘汰 (SHAttered 碰撞攻擊),TLS/憑證已禁用
SHA256Secure Hash Algorithm 256256 bits (64 Hex)不可逆推薦 目前主流標準
PBKDF2 / bcrypt / Argon2金鑰衍生 / 密碼雜湊可配置單向 + 慢速運算密碼儲存首選 (抗暴力破解)

相關類別速查

  • MD5: MD5 (抽象基類)、MD5CryptoServiceProvider (具體實作)、FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5") (簡易靜態方法)。
  • SHA1: SHA1、SHA1CryptoServiceProvider、FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1")。
  • 現代建議: 直接使用 SHA256Managed、HMACSHA256 或 Rfc2898DeriveBytes (PBKDF2)。

三種 MD5 實作方式比較 (C#)

方式一:new 具體提供者 (舊式、指定編碼)

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 字元
    }
}

方式二:靜態 Create 工廠方法 (推薦、支援多型)

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

方式三:FormsAuthentication 一行搞定 (最簡單、但輸出固定格式)

public string GetMd5_V3(string input)
{
    // 回傳標準 32 字元大寫 Hex (相容舊系統)
    return FormsAuthentication.HashPasswordForStoringInConfigFile(input, "MD5");
}

關鍵安全實務提醒

  1. 傳輸層加密是前提: 所有範例皆為**伺服器端運算**。若客戶端以明文傳送密碼,中間人攻擊仍可竊取。生產環境必須全站 HTTPS (TLS 1.2+)。
  2. 密碼儲存請加鹽 + 慢速雜湊: 純 MD5/SHA1 極易被彩虹表/GPU 破解。請改用 Rfc2898DeriveBytes (PBKDF2)、BCrypt.Net-Next 或 Argon2 庫,並儲存 Salt + Hash + 迭代次數。
  3. 編碼一致性: Encoding.UTF8 是跨平台安全選擇,避免 Encoding.Default 隨作業系統變化導致驗證失敗。
  4. 時序攻擊防禦: 驗證雜湊時使用固定時間比較 (如 CryptographicOperations.FixedTimeEquals),防止側通道攻擊。

現代化選型決策樹

需要儲存使用者密碼?
  ├─ 是 → 使用 PBKDF2 (Rfc2898DeriveBytes) / bcrypt / Argon2 + 隨機 Salt + 高迭代/記憶體成本
  └─ 否
       ├─ 需資料完整性驗證 (非機密) → SHA256 / HMACSHA256 (含金鑰)
       ├─ 需數位簽章 → RSA/ECDSA + SHA256
       └─ 相容舊系統 (MD5/SHA1) → 僅限非安全用途 (如快取 Key、非敏感 ID),並規劃遷移路線圖

結論: 了解 MD5/SHA1 呼叫方式有助維護舊系統,**新專案請直接採用 SHA256 以上與專用密碼雜湊演算法**,並在傳輸與儲存全鏈路落實加密與存取控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved