在asp.net web api 中 HMAC 来看门

147 阅读3分钟

在ASP.NET中,HMAC(Hash-based Message Authentication Code)通常用于验证数据的完整性和真实性,而不是用于加密和解密数据。HMAC可以生成一个固定长度的哈希值,该哈希值基于密钥和消息数据。HMAC-256是使用SHA-256哈希函数的一种HMAC变体。

以下是一个ASP.NET Core示例,展示如何使用HMAC-256生成和验证消息的哈希值。

1. 安装必要的包

ASP.NET Core通常已经包含了必要的加密库。不过,为了安全起见,确保你有一个较新的.NET版本。

2. 编写HMAC-256生成和验证的代码

using System;
using System.Security.Cryptography;
using System.Text;

public class Hmac256Example
{
    private static readonly Encoding Encoding = Encoding.UTF8;

    // 生成HMAC-256哈希值
    public static string ComputeHmac256Hash(string message, string key)
    {
        using (var hmac = new HMACSHA256(Encoding.GetBytes(key)))
        {
            byte[] messageBytes = Encoding.GetBytes(message);
            byte[] hashMessage = hmac.ComputeHash(messageBytes);
            return Convert.ToBase64String(hashMessage);
        }
    }

    // 验证HMAC-256哈希值
    public static bool VerifyHmac256Hash(string message, string key, string hash)
    {
        string computedHash = ComputeHmac256Hash(message, key);
        return computedHash.Equals(hash, StringComparison.Ordinal);
    }

    public static void Main()
    {
        string message = "This is a secret message.";
        string key = "your-secret-key";

        // 生成哈希值
        string hash = ComputeHmac256Hash(message, key);
        Console.WriteLine($"Computed Hash: {hash}");

        // 验证哈希值
        bool isValid = VerifyHmac256Hash(message, key, hash);
        Console.WriteLine($"Is hash valid? {isValid}");

        // 验证错误的哈希值
        bool isInvalid = VerifyHmac256Hash(message, key, "invalid-hash");
        Console.WriteLine($"Is invalid hash valid? {isInvalid}");
    }
}

3. 运行示例

将上述代码放入一个控制台应用程序(或者ASP.NET Core应用程序中的某个类),然后运行它。你将看到生成的哈希值以及哈希值验证的结果。

注意事项

  1. 密钥管理:确保你的密钥是安全的,不要硬编码在代码中,特别是在生产环境中。
  2. 哈希值不可逆:注意,HMAC生成的哈希值是不可逆的,这意味着你不能从哈希值恢复原始消息。HMAC主要用于验证数据的完整性和真实性。
  3. 时间戳和随机数:在实际应用中,通常会将时间戳和随机数等附加到消息中,以防止重放攻击。

在ASP.NET Core Web API中的应用

在ASP.NET Core Web API中,你可以使用HMAC-256来验证请求数据的完整性。例如,在请求头中包含一个HMAC哈希值,然后在服务器端验证该哈希值。

以下是一个简单的示例,展示如何在ASP.NET Core Web API中使用HMAC-256进行请求验证:

// 在Startup.cs或Program.cs中配置中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ... 其他中间件配置

    app.Use(async (context, next) =>
    {
        var secretKey = "your-secret-key"; // 请确保密钥安全
        var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
        context.Request.Body.Position = 0; // 重置位置,以便下一个中间件可以读取

        var hmacHeader = context.Request.Headers["X-HMAC-SHA256"];
        if (hmacHeader.Count > 0)
        {
            var computedHmac = ComputeHmac256Hash(requestBody, secretKey);
            if (!computedHmac.Equals(hmacHeader.FirstOrDefault(), StringComparison.Ordinal))
            {
                context.Response.StatusCode = StatusCodes.Status403Forbidden;
                await context.Response.WriteAsync("Invalid HMAC.");
                return;
            }
        }
        else
        {
            context.Response.StatusCode = StatusCodes.Status400BadRequest;
            await context.Response.WriteAsync("HMAC header missing.");
            return;
        }

        await next();
    });

    // ... 其他中间件配置和路由配置
}

// ComputeHmac256Hash 方法同上

在这个示例中,中间件会读取请求的主体,并计算HMAC哈希值。然后,它会验证请求头中的HMAC值是否与计算出的哈希值匹配。如果不匹配,则返回403 Forbidden状态码。