[英]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,因为密钥将以纯文本格式传输。
在高流量应用程序的一般情况下,上述所有答案都有许多攻击者可以轻易利用的缺陷:有了破监狱的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)
现在,您拥有了发送到服务器所需的一切:
在标题中,您还需要发送otp
, salt
和device_token
!
在服务器上,您将执行标记为B1-3
的相同步骤,并将哈希结果与客户端提供的结果进行比较。 之后,您必须确保为此device_token
“禁用”了该salt
,以避免重播攻击。
这种方法仍然有一个缺陷,但是需要攻击者做更多的工作:他们可以在编译后的代码中找到您的api_key
。
我正在一个类似的项目中,我为访问我的API的每个用户或客户端应用程序分配唯一的API密钥。 我不是安全专家,但我建议您使用SSL并为您的Android和iOS应用程序生成唯一的API密钥。 使用SSL,传输到您的API的数据将被加密和保护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.