【问题标题】:Encrypt a web api request body content and decrypt on server加密 web api 请求正文内容并在服务器上解密
【发布时间】:2017-01-17 17:50:53
【问题描述】:

我希望创建一个简单的安全解决方案,通过使用 Fiddler 或其他东西拦截请求,不会简单地将 Web API 正文内容显示给所有希望看到的人。我受到限制,因为我不能使用 SSL。我已经实现了 HMAC 类型的身份验证,我想通过在客户端上创建正文内容的加密并将该请求发送到服务器来更进一步,然后服务器将解密正文并按预期转发操作但是解密。我对服务器端 HMAC 使用了一个过滤器,在客户端使用了一个 delegatingHandler。

我对处理 http 请求不是很熟悉,也不完全了解如何拦截所有正文内容,然后对其进行加密并将其放回 httpcontent。

任何想法或帮助将不胜感激。

【问题讨论】:

  • 为什么不能使用https?这似乎是要走的路
  • https 为您处理加密。重新发明轮子是没有意义的,即使你这样做了,它也永远不会像 https 那样安全。 这不是对您作为开发人员的技能的抨击,而是对大多数标准的深思熟虑和安全性的声明。
  • 这个问题比这里更适合信息安全
  • 客户端运行在非常特殊的配置上,只有端口 80 可用。无法使用 443,因此我们无法使用 ssl。
  • 如果你真的不能使用 TLS(我会反击这个要求,如果需要,你可以在技术上运行TLS on port 80),你必须 确保使用提供完整性和机密性的密码和块模式(AES/GCM、EAX 或 CCM)安全地加密数据。实现您自己的 HMAC 标记是不必要的,但实际上,请使用 TLS。这些东西很难做对,互联网已经提供了多年的 TLS 攻击来证明它的价值和修复。

标签: c# encryption asp.net-web-api


【解决方案1】:

为了在 WEB API 中发生模型映射之前解密数据,您可以劫持 AuthorizeAttribute,因为 ActionFilterAttribute 发生在 模型映射之后

我知道 AuthorizeAttribute 是出于另一个原因,但劫持它对我来说非常有效(我想解压缩 zip 内容)。

    public class DecryptAttribute : AuthorizeAttribute
    {
      public override void OnAuthorization(HttpActionContext actionContext)
      {
              actionContext.Request.Content =  DecryptContect(actionContext.Request.Content);
      }
    }

然后用这个属性装饰你所有的 WebAPI 控制器。

为了压缩并嵌入到正文中,我使用了 Delegating Handler

    public class EncryptHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
        {
            HttpResponseMessage response = responseToCompleteTask.Result;
                response.Content = new EncryptContent(response.Content);

            return response;
        },
        TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}

那就注册吧

GlobalConfiguration.Configuration.MessageHandlers.Add(new EncryptHandler());

【讨论】:

  • 谢谢@Anestis Kivranoglou。那么你能告诉我你的DecryptContext函数吗?它是否返回 HttpContent 派生的各种实例?我已经有一个 IAuthenticationFilter 实现,它实现了一种 HMAC 类型的身份验证,以便验证和确认只处理来自某个客户端的请求。我一直在想我可以在这里简单地加密和解密正文内容我主要担心我对 http 内容的缺乏经验,因此是 HttpContent 类型。它有很多成员,没有明显的 SetContent,而有一个 CopyContent 来获取它。
  • 我没有加密解密逻辑,我只是​​发布了例如函数。我使用此包装器将压缩解压缩为 gzip。你必须想办法加密解密字符串内容
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多