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

ASP.NET 中 MD5 與 SHA1 加密實作:三種方法完整比較

     編輯:ASP.NET 基礎

密碼雜湊是資安基礎。MD5(128-bit)與 SHA1(160-bit)雖已知碰撞弱點,**不適合高安全性場景**(如數位簽章、SSL 憑證),但對一般應用程式密碼儲存、資料完整性驗證仍具參考價值。本文整理 ASP.NET 三種實作方式。

核心類別對照

演算法核心類別便捷方法
MD5MD5CryptoServiceProvider, MD5.Create()FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5")
SHA1SHA1CryptoServiceProvider, SHA1.Create()FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1")

三種 MD5 實作方法

方法一:new 運算子建立提供者(可控制輸出長度)

public string GetMd5Method1(string source)
{
    using (MD5 md5 = new MD5CryptoServiceProvider())
    {
        byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(source));
        // 取 9-25 位(16 字元),或完整 32 字元
        string result = BitConverter.ToString(hash, 4, 8).Replace("-", "");
        // 完整版:BitConverter.ToString(hash).Replace("-", "");
        return result;
    }
}

方法二:靜態 Create 工廠方法(推薦,可指定編碼)

public string GetMd5Method2(string source)
{
    using (MD5 md5 = MD5.Create())
    {
        byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(source)); // 建議 UTF-8
        StringBuilder sb = new StringBuilder();
        foreach (byte b in hash)
            sb.Append(b.ToString("X2")); // 大寫十六進位,兩位數補零
        return sb.ToString();
    }
}

方法三:FormsAuthentication 一行搞定(最簡潔)

public string GetMd5Method3(string source)
{
    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");
}

SHA1 同理,僅更換類別與演算法名稱

// 方法二 SHA1 版
public string GetSha1Method2(string source)
{
    using (SHA1 sha1 = SHA1.Create())
    {
        byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(source));
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }
}

// 方法三 SHA1 版
public string GetSha1Method3(string source)
{
    return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1");
}

關鍵比較與選擇建議

維度方法一方法二方法三
彈性高(可切片輸出)高(可控編碼、格式)低(固定 32/40 字元大寫)
編碼控制Encoding.Default(系統相關)**可指定 UTF-8/Unicode**(推薦)內部固定
效能同級同級同級
相依性System.Security.CryptographySystem.Security.CryptographySystem.Web.Security
適用場景需特定長度輸出**通用推薦**快速原型、相容舊代碼

⚠️ 重要安全提醒

  1. 全為伺服器端加密:傳輸過程密碼為明文,必須配合 **HTTPS (TLS)** 使用
  2. MD5/SHA1 不適用現代密碼儲存:無 Salt、速度太快、易暴力破解
    → 現代標準:**PBKDF2、bcrypt、scrypt、Argon2**(含 Salt、可調運算成本)
  3. ASP.NET Core 內建:IPasswordHasher<TUser> 預設使用 PBKDF2 + HMAC-SHA256 + 隨機 Salt
  4. 舊專案升級策略**:登入時驗證舊雜湊,通過則重新雜湊存儲新格式,漸進式遷移

現代密碼雜湊最佳實務(.NET Core 範例)

// 註冊時
var hasher = new PasswordHasher<User>();
user.PasswordHash = hasher.HashPassword(user, plainPassword);

// 登入驗證
var result = hasher.VerifyHashedPassword(user, user.PasswordHash, inputPassword);
if (result == PasswordVerificationResult.SuccessRehashNeeded)
{
    // 演算法升級,重新雜湊存儲
    user.PasswordHash = hasher.HashPassword(user, inputPassword);
    await _userRepo.UpdateAsync(user);
}

理解傳統雜湊實作有助於維護舊系統,但新專務請直接採用現代密碼雜湊標準,守住資安第一道防線。

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