验证从移动(iPhone)应用程序到ASP.Net Web API的请求(在我的设计上请求反馈)

Sto*_*oop 49 security iphone authentication token asp.net-web-api

我正在设计一个拥有移动伴侣的网站(仅限初始iPhone).该网站将是ASP.Net MVC 3应用程序.我还将有一个ASP.Net Web API站点(MVC 4)来向iPhone应用程序公开服务.iPhone应用程序将拥有自己的表单来捕获用户的用户名和密码,并将其发送到JSON标头中的Web API.

我想从一开始就考虑安全性,而不是经过深思熟虑.我无论如何都不是安全专家.我做了很多研究,看看其他人是如何处理来自Web服务的移动应用程序客户端的身份验证.我想我已经提出了一个不错的解决方案,不涉及到第三方oAuths.

我非常感谢任何人提供的任何和所有意见,建议,批评和一般WTF.:)

我最担心的是:

  1. 确保对Web API的调用获得授权
  2. 最大限度地降低重播攻击的风险(因此下面的调用中的时间戳)

iPhone应用程序将如下开发:
两个字符串被硬编码到iPhone应用程序中(每个用户的值相同):

  1. 应用程序ID
    这是一个字符串,用于标识正在访问Web API(iPhone,Android,Windows phone等)的客户端类型.

  2. 应用程序的散列盐
    这是一个字符串,用于为用户不可知的请求提供哈希值.

两个字符串存储在iPhone应用程序的本地数据库中(每个用户唯一的值):

  1. API用户访问令牌
    这是成功验证后由Web API提供给客户端的字符串(令牌),允许客户端访问Web API而不在每个请求中发送用户名和密码.
  2. 用户的哈希盐
    这是一个字符串,用于对已建立的用户帐户发出的请求进行哈希哈希.



iPhone将以下列方式调用Web API:

API方法:创建帐户
客户端发送:

  • 新帐户数据(用户名,密码,名字,姓氏等)
  • 应用程序ID
  • UTC时间戳
  • 使用应用程序的哈希盐盐化的UTC时间戳+应用程序ID的哈希值

API返回:

  • 新用户的哈希盐

    这里的想法是,在创建帐户时,我可以使用应用程序的硬编码盐,因为如果盐已经通过反编译或其他方式,它不会带来巨大的安全风险.

    但是对于访问和修改用户数据的方法,我将使用仅由该用户拥有的salt,因此攻击者无法使用它来模仿其他人.


API方法:获取帐户
(用于获取用户的哈希盐,用于在网站上创建但尚未在iPhone上同步的帐户.当用户尝试登录iPhone并且iPhone检测到它有没有该用户名的记录.)

客户发送:

  • 用户名
  • 密码(使用应用程序的哈希盐进行哈希处理)
  • 应用程序ID
  • UTC时间戳
  • 使用应用程序的哈希盐盐化的UTC时间戳+应用程序ID的哈希值

API返回:

  • 现有用户的哈希盐


API方法:登录(验证)
客户端发送:

  • 用户名
  • 密码(用户的哈希盐哈希)
  • 应用程序ID
  • UTC时间戳
  • 使用用户的哈希盐盐化的UTC时间戳+应用程序ID的哈希值

API返回:

  • API用户访问令牌


API方法:任何命令(即创建帖子,更新配置文件,获取消息等...)
客户端发送:

  • 命令数据
  • API用户访问令牌
  • 应用程序ID
  • UTC时间戳
  • 使用用户的哈希盐盐化的UTC时间戳+应用程序ID + API用户访问令牌的哈希值

S.P*_*.P. 3

我的建议

  1. 身份验证和授权。在 2 个不同的服务器上构建它(在某些项目中我也使用了 3 个)。反向代理服务器对此非常擅长。在一台服务器上进行身份验证并在另一台服务器上进行授权。

我认为这是使用 Web API 的移动安全所需的最重要的一步。

  1. 封装一切。

  2. 对所有安全信息使用 SSL。就我而言,我将它用于所有事情。

  3. 对于您的时间戳,请选择您可以获得授权的合适时间。不要让它太短,因为您的应用程序会变得很慢,或者太长,因为网络嗅探器可以访问数据包。

如果您想要 3 服务器架构 对于您的请求,您还需要一个应用程序密钥,您可以使用它来生成访问密钥(从服务器 1)。此访问密钥将验证您的请求,在成功验证(来自服务器 2)后,您可以使用该密钥授权来自另一台服务器(服务器 3)的请求

你提到的要求是标准规范。真的不认为这有什么问题。