在上一篇文章中,我們介紹了 API Key、OAuth 2.0、JWT、IP 白名單、速率限制以及 HTTPS 等常見的 API 保護方法。今天,我們將繼續探討如何在 .NET Core 中應用進階的安全措施來進一步保護 API,這些措施包括 CORS、靜態數據加密、授權策略、HMAC 驗證、防篡改標頭 和 雙重身份驗證(2FA)。
CORS(Cross-Origin Resource Sharing)是瀏覽器用來限制網頁從一個域訪問另一個域的 API 的一種安全機制。通過配置 CORS,可以限制哪些域能夠訪問 API,從而防止未授權的跨域請求。
在 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();
});
}
優點:
靜態數據加密保護數據在存儲時的安全性,這樣即使攻擊者獲得數據存儲的訪問權限,也無法讀取其中的敏感信息。這一保護措施對於防止數據洩漏至關重要。
使用 .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();
}
}
}
優點:
.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 可以訪問的資源!");
}
}
優點:
HMAC(Hash-based Message Authentication Code)是一種用於驗證消息完整性和來源真實性的加密技術。使用 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);
}
}
優點:
防篡改標頭通過對請求中的數據進行簽名,來確保數據在傳輸過程中沒有被篡改。這種技術常用於保護 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 發送,伺服器端再驗證這個簽名。
優點:
雙重身份驗證為 API 增加了一層安全保護,除了傳統的用戶名和密碼,還要求用戶提供一次性密碼(OTP)來驗證身份。
登錄時除了驗證用戶密碼,還需要驗證一次性密碼(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 的優化,以確保系統的高可用性。