我正在设计一个有移动伴侣的网站(最初只有 iPhone)。该网站将是一个 ASP.Net MVC 3 应用程序。我还将有一个 ASP.Net Web API 站点 (MVC 4) 来向 iPhone 应用程序公开服务。iPhone 应用程序将有自己的表单来捕获用户的用户名和密码,并将其发送到 JSON 标头中的 Web API。
我想从一开始就考虑安全性,而不是事后考虑。无论如何,我都不是安全专家。我已经进行了大量研究,以了解其他人如何处理来自 Web 服务的移动应用程序客户端的身份验证。我想我已经想出了一个不错的解决方案,它不涉及连接到第三方 oAuths。
我将非常感谢你们任何人可以提供的任何和所有意见、建议、批评和一般 WTF。:)
我最大的担忧是:
- 确保对 Web API 的调用得到授权
- 最大限度地降低重放攻击的风险(因此在下面的调用中使用时间戳)
iPhone 应用程序将这样开发:
两个字符串被硬编码到 iPhone 应用程序中(每个用户的值相同):
- 应用程序 ID
这是一个字符串,用于识别访问 Web API 的客户端类型(iPhone、Android、Windows 手机等)。 - 应用程序的哈希加盐
这是一个字符串,用于为与用户无关的请求加盐哈希。
两个字符串存储在 iPhone 应用程序的本地数据库中(每个用户唯一的值):
- API 用户访问令牌
这是 Web API 在成功验证后提供给客户端的字符串(令牌),允许客户端访问 Web API,而无需在每个请求中发送用户名和密码。 - User's Hashing Salt
这是一个字符串,用于对针对已建立用户帐户的请求进行加盐哈希。
iPhone 将通过以下方式调用 Web 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 用户访问令牌用用户的哈希盐加盐