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

ASP.NET FormsAuthentication 雜湊密碼驗證:HashPasswordForStoringInConfigFile、SHA1 與現代 PBKDF2/BCrypt 最佳實踐

     編輯:關於ASP.NET

經典 ASP.NET 使用 FormsAuthentication.HashPasswordForStoringInConfigFile 進行密碼雜湊驗證。本文示範舊版寫法並說明為何應遷移至現代演算法。

舊版實作 (不建議新專案使用)

private void LoginButton_Click(object sender, EventArgs e)
{
    string sql = "SELECT PasswordHash FROM Users WHERE Username=@User";
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ConnectionString))
    using (SqlCommand cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@User", UserIdBox.Text);
        conn.Open();
        object dbHashObj = cmd.ExecuteScalar();
        if (dbHashObj == null) { Result.Text = "使用者不存在"; return; }

        string dbHash = dbHashObj.ToString();
        // 使用者輸入密碼 → SHA1 雜湊 → 與資料庫比對
        string inputHash = FormsAuthentication.HashPasswordForStoringInConfigFile(PasswordTextBox.Text, "SHA1");

        if (inputHash == dbHash)
        {
            FormsAuthentication.RedirectFromLoginPage(UserIdBox.Text, true);
        }
        else
        {
            Result.Text = "密碼錯誤";
        }
    }
}

關鍵缺陷

  • SHA1 已被攻破:碰撞攻擊可行、彩虹表查詢極快 (GPU 百億次/秒)。
  • 無 Salt:相同密碼產生相同雜湊,易受查表攻擊。
  • 無迭代:單次雜湊極快,暴力破解成本極低。
  • API 已標記過時:.NET 4.0+ 標記 [Obsolete],Core/5+ 已移除。

現代最佳實踐:PBKDF2 / BCrypt / Argon2

演算法.NET 實作特點建議參數
PBKDF2 (Rfc2898DeriveBytes)內建 System.Security.Cryptography標準化、可調整迭代次數HMAC-SHA256, 100,000+ 迭代, 16+ 位元組 Salt
BCryptNuGet BCrypt.Net-Next內建 Salt、自適應成本因子Work Factor 12+ (2^12 迭代)
Argon2idNuGet Konscious.Security.Cryptography.Argon2記憶體硬化、抗 GPU/ASICTime=3, Memory=64MB, Parallelism=4
ASP.NET Core Identity內建 PasswordHasher<TUser>PBKDF2 + 隨機 Salt + 版本化直接使用 HashPassword/VerifyHashedPassword

PBKDF2 手動實作範例 (.NET Framework 4.7.2+ / Core)

public static string HashPassword(string password, int iterations = 100000)
{
    using (var rng = RandomNumberGenerator.Create())
    {
        byte[] salt = new byte[16];
        rng.GetBytes(salt);

        using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256))
        {
            byte[] hash = pbkdf2.GetBytes(32); // 256-bit
            // 格式:iterations.salt.hash (Base64)
            return $"{iterations}.{Convert.ToBase64String(salt)}.{Convert.ToBase64String(hash)}";
        }
    }
}

public static bool VerifyPassword(string password, string stored)
{
    var parts = stored.Split('.');
    if (parts.Length != 3) return false;
    int iterations = int.Parse(parts[0]);
    byte[] salt = Convert.FromBase64String(parts[1]);
    byte[] hash = Convert.FromBase64String(parts[2]);

    using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256))
    {
        byte[] testHash = pbkdf2.GetBytes(32);
        return CryptographicOperations.FixedTimeEquals(hash, testHash); // 定時比較防時序攻擊
    }
}

遷移策略

  1. 新用戶直接使用新演算法。
  2. 2. 舊用戶登入成功時,驗證舊 SHA1 → 重新雜湊為新格式 → 更新資料庫 → 標記已遷移。 3. 設定截止日,強制未遷移用戶重設密碼。

密碼儲存安全性關係用戶資產與企業聲譽,**請立即停用 SHA1/MD5,採用 PBKDF2/BCrypt/Argon2**。

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