iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Software Development

使用 C# 從零開始玩轉 Web API,從基礎到微服務與雲端部署的全面探索系列 第 19

Day 19: 保護你的 API(下) .NET Core 中的進階 API 安全設置

  • 分享至 

  • xImage
  •  

在上一篇文章中,我們介紹了 API Key、OAuth 2.0、JWT、IP 白名單、速率限制以及 HTTPS 等常見的 API 保護方法。今天,我們將繼續探討如何在 .NET Core 中應用進階的安全措施來進一步保護 API,這些措施包括 CORS靜態數據加密授權策略HMAC 驗證防篡改標頭雙重身份驗證(2FA)


1. CORS(跨源資源共享)保護

CORS(Cross-Origin Resource Sharing)是瀏覽器用來限制網頁從一個域訪問另一個域的 API 的一種安全機制。通過配置 CORS,可以限制哪些域能夠訪問 API,從而防止未授權的跨域請求。

如何設置 CORS

Startup.cs 中,我們可以通過 services.AddCors() 方法來配置 CORS,限制 API 只能被信任的域名訪問。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("<https://trustedwebsite.com>")
                              .AllowAnyMethod()
                              .AllowAnyHeader());
    });

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();

    // 啟用 CORS
    app.UseCors("AllowSpecificOrigin");

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

優點

  • 限制跨域訪問,防止 CSRF 攻擊。
  • 提高跨域安全性。

2. 靜態數據加密(Data Encryption at Rest)

靜態數據加密保護數據在存儲時的安全性,這樣即使攻擊者獲得數據存儲的訪問權限,也無法讀取其中的敏感信息。這一保護措施對於防止數據洩漏至關重要。

如何加密靜態數據

使用 .NET Core 的 AesCryptoServiceProvider 進行數據加密,確保在數據存儲前被加密。

public static byte[] EncryptData(string plainText, byte[] key, byte[] iv)
{
    using (var aes = new AesCryptoServiceProvider())
    {
        aes.Key = key;
        aes.IV = iv;

        var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        using (var msEncrypt = new MemoryStream())
        {
            using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (var swEncrypt = new StreamWriter(csEncrypt))
            {
                swEncrypt.Write(plainText);
            }

            return msEncrypt.ToArray();
        }
    }
}

優點

  • 保護靜態數據,防止數據洩漏。
  • 適合高敏感數據的存儲,如個人信息和財務數據。

3. 授權策略(Authorization Policies)

.NET Core 的授權策略允許開發者根據用戶的角色、權限等進行精細的 API 訪問控制,適合處理複雜的授權邏輯。

如何配置授權策略

Startup.cs 中配置授權策略,根據具體的角色或聲明來限制 API 訪問。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });

    services.AddControllers();
}

應用授權策略:

[Authorize(Policy = "AdminOnly")]
[ApiController]
[Route("api/[controller]")]
public class AdminController : ControllerBase
{
    [HttpGet]
    public IActionResult GetAdminResource()
    {
        return Ok("只有 Admin 可以訪問的資源!");
    }
}

優點

  • 細緻的權限控制,根據角色或聲明限制訪問。
  • 擴展性強,適合複雜授權邏輯。

4. HMAC 驗證

HMAC(Hash-based Message Authentication Code)是一種用於驗證消息完整性和來源真實性的加密技術。使用 HMAC 可以防止請求數據在傳輸過程中被篡改。

如何生成 HMAC

我們可以使用 HMAC-SHA256 來驗證請求的完整性:

public static string GenerateHMAC(string message, string secretKey)
{
    using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey)))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        return Convert.ToBase64String(hash);
    }
}

優點

  • 防止請求在傳輸過程中被篡改。
  • 適用於需要高安全性的數據傳輸。

5. 防篡改標頭(Anti-Tampering Header)

防篡改標頭通過對請求中的數據進行簽名,來確保數據在傳輸過程中沒有被篡改。這種技術常用於保護 API 數據的完整性。

如何實現防篡改標頭

對請求的數據進行簽名,並將簽名作為請求的一部分發送。伺服器端驗證簽名以確保請求未被修改。

public static string CreateSignature(string message, string secretKey)
{
    using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey)))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        return Convert.ToBase64String(hash);
    }
}

然後將簽名作為自定義 Header 發送,伺服器端再驗證這個簽名。

優點

  • 增強請求數據的完整性保護。
  • 防止惡意修改請求數據。

6. 雙重身份驗證(Two-Factor Authentication, 2FA)

雙重身份驗證為 API 增加了一層安全保護,除了傳統的用戶名和密碼,還要求用戶提供一次性密碼(OTP)來驗證身份。

如何實現 2FA

登錄時除了驗證用戶密碼,還需要驗證一次性密碼(OTP)。這可以通過第三方身份驗證服務(如 Google Authenticator)來實現。

public IActionResult VerifyOTP(string otp)
{
    // 假設我們從外部系統生成或驗證 OTP
    if (IsValidOTP(otp))
    {
        return Ok("雙重驗證成功!");
    }
    else
    {
        return Unauthorized("OTP 驗證失敗!");
    }
}

private bool IsValidOTP(string otp)
{
    // 驗證 OTP 的邏輯
    return otp == "123456"; // 這裡是簡單示例,實際應用中應該從系統獲取
}

優點

  • 增加額外的身份驗證層,適合高安全性應用。
  • 減少帳戶被劫持的風險。

每日小結

在 .NET Core 中,除了基本的 API 保護措施(如 API Key、JWT 等)外,還有許多進階的保護手段可用來提高 API 的安全性。通過靈活組合 CORS靜態數據加密授權策略HMAC 驗證防篡改標頭2FA,你可以針對不同的應用場景實現更高層次的安全防護。

根據應用需求選擇和組合這些方法,不僅可以保證 API 的穩定性和可用性,還能有效地防止惡意攻擊和數據洩露。明天我們將進一步探討如何在高負載環境中進行 API 的優化,以確保系統的高可用性。


上一篇
Day 18: 保護你的 API(中)
下一篇
Day 20: 實際開發 API 權限保護(上) 程式實作
系列文
使用 C# 從零開始玩轉 Web API,從基礎到微服務與雲端部署的全面探索22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言