我设计一个网站,将拥有移动广告(仅限initally iPhone)。 该网站将是一个ASP.Net MVC 3应用程序。 我也将有一个ASP.Net的Web API网站(MVC 4)公开服务的iPhone应用程序。 iPhone应用程序将有它自己的形式从用户获取用户名和密码发送到JSON头的网络API。
我要考虑从一开始就安全性,而不是想后。 我不以任何方式安全专家。 我所做的研究一个很好的协议,看看其他的都是从web服务处理移动应用客户端的认证。 我想我已经想出了一个体面的解决办法,不涉及挂接到第三方oAuths。
我将不胜感激任何和所有的意见,建议,批评和一般WTFs任何你可以提供。 :)
我最大的担忧是:
- 确保到Web API的调用被授权
- 最大限度地减少重放攻击的风险(在下面的调用,因此时间戳)
iPhone应用程序将被开发成这样:
两个字符串是硬编码到iPhone应用程序(为每个用户相同的值):
- 应用程序ID
这是一个用来识别客户正在访问的Web API(在iPhone,Android,Windows phone的,等)类型的字符串。 - 应用程序的散列盐
这是用来盐哈希用户无关的请求字符串。
两个字符串存储在iPhone应用程序的本地数据库(值唯一的每个用户):
- API用户访问令牌
这是在验证成功后由web API提供给客户机的字符串(令牌),并且允许客户端不发送在每个请求中的用户名和密码访问web API。 - 用户散列盐
这是用来盐哈希针对建立用户帐户的请求字符串。
而iPhone将作出以下方式在网络API调用:
API方法:创建帐户
客户端发送:
- 新的帐户数据(用户名,密码,姓氏,名字等。)
- 应用程序ID
- UTC时间戳
- UTC时间戳+应用程序ID的哈希加盐与应用程序的散列盐
API返回:
- 新用户的哈希盐
这里的想法是,在创建帐户时,我可以使用该应用程序的硬编码的盐,因为它不是一个巨大的安全隐患,如果是盐曾经得到了(通过反编译或其他方式)。
但是对于那些访问和修改用户数据,我会使用由该用户只拥有,因此它不能被攻击者用来冒充他人盐的方法。
API方法:获取帐号
(用于获取用户的散列盐用于在网站上创建的,但尚未同步iPhone上的帐户。这种情况发生在用户尝试登录iPhone和iPhone检测到它已为该用户名没有记录。)
客户端发送:
- 用户名
- 密码(散列与应用的散列盐)
- 应用程序ID
- UTC时间戳
- UTC时间戳+应用程序ID的哈希加盐与应用程序的散列盐
API返回:
- 现有用户的哈希盐
API方法:登录(认证)
客户端发送:
- 用户名
- 密码(与用户的哈希散列盐)
- 应用程序ID
- UTC时间戳
- UTC时间戳+应用程序ID的哈希加盐与用户的哈希盐
API返回:
- API用户访问令牌
API方法:任何命令(即创建后,更新个人资料,获取信息,等...)
客户端发送:
- 命令数据
- API用户访问令牌
- 应用程序ID
- UTC时间戳
- UTC时间戳+应用程序ID + API用户访问令牌的哈希加盐与用户的哈希盐