繁体   English   中英

如何保护我的Web API-具有Android / iOS应用的MVC4

[英]How to secure my Web API - MVC4 with Android/iOS apps

我在这里已经阅读了很多有关使用api密钥,令牌,hmac ect保护Web api的问题,但是没有找到我要找的答案。

我正在使用Internet和Intranet网站,Web API和Android / iOS应用程序进行MVC4 Web应用程序项目。

Web API将由我的应用程序使用,其他任何人都无法使用,因为它将访问敏感数据

保护此api以便仅我的应用可以使用它的最佳方法是什么? 看起来如此简单的请求很难上手。

我使用HMAC和其他一些方法查看了SO上的帖子,但是它们似乎都没有适合他们的选项,很可能我只是缺少了一些东西。

HMAC是一种解决方法,还是客户证书更适合这种情况?

我应该使用SSL和某种API密钥吗?

我知道这个问题有点含糊,我盯着它看了一个多小时,试图弄清楚如何表达我的想法,所以我想我会发布它并在需要时进行更新... :(

我非常乐意根据要求提供更多详细信息。

为您的每个应用生成密钥,并让它们在每个请求中将令牌作为令牌传递。 然后,您的服务器可以验证密钥并验证请求。

看一下ASP.NET站点上的“ 基本身份验证”模块。 该示例使用“基本”作为授权方案,但您可以改为使用“令牌”进行更改。

private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
    {
        var request = HttpContext.Current.Request;
        var authHeader = request.Headers["Authorization"];
        if (authHeader != null)
        {
            var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

            // RFC 2617 sec 1.2, "scheme" name is case-insensitive
            if (authHeaderVal.Scheme.Equals("token",
                    StringComparison.OrdinalIgnoreCase) &&
                authHeaderVal.Parameter != null)
            {
                AuthenticateUser(authHeaderVal.Parameter);
            }
        }
    }

一旦安装了基本身份验证模块,就可以使用Authorize属性简单地装饰任何操作或控制器,它将请求转发给基本身份验证处理程序。

namespace webapi.Controllers
{
     [Authorize]
     public class SensitiveDataController : ApiController
     {
       ...
     }
}

在使用基本身份验证时,就必须通过有线方式使用SSL,因为密钥将以纯文本格式传输。

您可以使用FormsAuthentication。 加密票证,并确保两个配置文件中的machineKey相同。 看到这个这个 这将允许在Web应用程序和api之间共享相同的用户凭据。 在这种情况下,ASP.NET FAM模块将建立身份。

对于api键,请查看hawk方案 它使用共享对称密钥。 但是,Hawk具有完整的功能,直到它到达1.0版为止,它可能会更改。 但是,它将为您提供实现基于HMAC的安全性的好主意。 在这里有一个适用于Hawk的.NET实现。 Pablo也有一个。 在这种情况下,您将需要编写消息处理程序以建立使用方应用程序的身份。

在高流量应用程序的一般情况下,上述所有答案都有许多攻击者可以轻易利用的缺陷:有了破监狱的iPhone,您可以破解SSL-而不是服务器,但当他们将应用程序挂在手机上时,他们至少可以分析您发送的包裹。

避免这种情况的最佳方法(我认为)是使用“准时密码”-实时准时密码。

您如何生成这些一次性密码?

A1。 为每个设备获取一个device_identifier (也可以是任何随机数,但应避免与其他设备的标识符冲突)

A2。 有一个api_key ,将用于哈希

现在,如果要将包发送到api,请执行以下操作:

B1。 构造您的普通包,这是一些json有效负载的示例:

var payload = {"hello":"world"}

B2。 使用您喜欢的哈希函数将您的var hashed_payload = hash(payload)哈希

B3。 生成此软件包的一次性密码:

var otp = hash(salt & hashed_payload & device_token & api_key)

现在,您拥有了发送到服务器所需的一切:

在标题中,您还需要发送otpsaltdevice_token

在服务器上,您将执行标记为B1-3的相同步骤,并将哈希结果与客户端提供的结果进行比较。 之后,您必须确保为此device_token “禁用”了该salt ,以避免重播攻击。

这种方法仍然有一个缺陷,但是需要攻击者做更多的工作:他们可以在编译后的代码中找到您的api_key

我正在一个类似的项目中,我为访问我的API的每个用户或客户端应用程序分配唯一的API密钥。 我不是安全专家,但我建议您使用SSL并为您的Android和iOS应用程序生成唯一的API密钥。 使用SSL,传输到您的API的数据将被加密和保护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM