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

ASP.NET Web API 安全驗證系列(三):摘要認證實作與安全性分析

     編輯:關於ASP.NET

ASP.NET Web API 安全驗證系列(三):摘要認證實作與安全性分析

接續 HTTP 基本認證,本文探討 Digest Authentication (摘要認證),解決基本認證「明文傳輸 Base64 編碼憑證」的安全缺陷。

摘要認證核心原理

不傳輸密碼本身,而是傳輸單向雜湊摘要,驗證流程:

  1. 用戶端請求受保護資源 (無憑證)。
  2. 伺服器回應 401 Unauthorized,附帶 WWW-Authenticate: Digest realm="...", nonce="...", qop="auth", ...。
  3. 用戶端計算回應摘要:
    HA1 = MD5(username:realm:password)
    HA2 = MD5(method:digestURI)
    Response = MD5(HA1:nonce:nc:cnonce:qop:HA2)
  4. 用戶端重發請求,Authorization 標頭攜帶 username, realm, nonce, uri, response, ...。
  5. 伺服器端以相同演算法計算預期摘要,比對 Response,一致則驗證通過。

摘要認證流程圖

關鍵安全特性

  • 密碼不傳輸:網路封包僅含摘要,無法逆向推導密碼 (MD5 單向性)。
  • 防重放攻擊:nonce (伺服器產生隨機值)、nc (請求計數器)、cnonce (用戶端隨機值) 組合確保每次請求唯一。
  • 完整性保護:qop="auth-int" 可包含實體內容雜湊,防篡改。
  • Realm 分域:同一伺服器可劃分多個保護域,各自獨立認證。

Web API 實作摘要認證濾波器


public class DigestAuthenticationAttribute : AuthorizationFilterAttribute {
    private readonly string _realm;
    public DigestAuthenticationAttribute(string realm = "DefaultRealm") { _realm = realm; }

    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken) {
        // 1. 檢查 Authorization 標頭
        var authHeader = actionContext.Request.Headers.Authorization;
        if (authHeader == null || authHeader.Scheme != "Digest") {
            Challenge(actionContext);
            return;
        }

        // 2. 解析 Digest 參數
        var paramsDict = ParseDigestParameters(authHeader.Parameter);
        if (!paramsDict.ContainsKey("username") || !paramsDict.ContainsKey("response") || !paramsDict.ContainsKey("nonce"))
        {
            Challenge(actionContext);
            return;
        }

        // 3. 取得使用者密碼 (實際應從資料庫/Identity 讀取)
        string username = paramsDict["username"];
        string password = GetUserPassword(username); // TODO: 實作
        if (password == null) { Challenge(actionContext); return; }

        // 4. 計算預期摘要
        string expectedResponse = ComputeDigestResponse(
            username, _realm, password,
            actionContext.Request.Method.Method,
            paramsDict["uri"],
            paramsDict["nonce"],
            paramsDict.ContainsKey("cnonce") ? paramsDict["cnonce"] : null,
            paramsDict.ContainsKey("nc") ? paramsDict["nc"] : null,
            paramsDict.ContainsKey("qop") ? paramsDict["qop"] : null
        );

        // 5. 比對 (防時序攻擊用恆定時間比較)
        if (!SecureEquals(paramsDict["response"], expectedResponse)) {
            Challenge(actionContext);
            return;
        }

        // 6. 驗證通過,設定 Principal
        var principal = new GenericPrincipal(new GenericIdentity(username), null);
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null) HttpContext.Current.User = principal;
    }

    private void Challenge(HttpActionContext actionContext) {
        var nonce = GenerateNonce();
        var challenge = string.Format(
            "Digest realm=\"{0}\", nonce=\"{1}\", qop=\"auth\", algorithm=MD5",
            _realm, nonce);
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
        actionContext.Response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Digest", challenge));
    }

    // 輔助方法:ParseDigestParameters, ComputeDigestResponse, GenerateNonce, SecureEquals, GetUserPassword
    // ... 略,完整實作需處理 nonce 快取、nc 遞增檢查、時序安全比較
}

基本認證 vs 摘要認證對比

維度Basic AuthDigest Auth
密碼傳輸Base64 編碼 (可逆)MD5 摘要 (單向)
防重放無Nonce + nc + cnonce
中間人攻擊極易受攻擊 (HTTPS 必須)較難,但非絕對 (需 HTTPS)
實作複雜度極低高 (解析、雜湊、Nonce 管理)
效能極佳稍低 (雜湊計算)
瀏覽器支援完美完美
代理/防火牆相容良好可能被修改標頭

現代最佳實務建議

  • 生產環境強制 HTTPS:無論 Basic/Digest/OAuth,傳輸層加密是前提。HTTPS 下 Basic Auth 可接受,但 Token/OAuth2 更佳。
  • 棄用 Digest Auth:實作複雜、MD5 已脆弱、無法支援現代密碼雜湊 (bcrypt/Argon2)、無刷新機制。業界標準轉向 OAuth 2.0 / OpenID Connect / JWT Bearer Token。
  • ASP.NET Core 內建:AddAuthentication().AddJwtBearer()、AddIdentity、AddOAuth,無需手寫濾波器。
  • 若必須用 Digest:使用 algorithm=SHA-256 或 SHA-512-256 (RFC 7616),實作 nonce 快取與過期、nc 單調遞增檢查、恆定時間比較。

總結

摘要認證透過挑戰-回應機制與單向雜湊避免密碼明文傳輸,提供基本防重放保護。但在現代架構下,HTTPS + JWT/OAuth2 為首選,Digest Auth 僅適用於無法部署 HTTPS 的舊系統維護或極特定受限環境。理解其原理有助於掌握 HTTP 認證演進脈絡。

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