1

我正在为 Windows Phone 和 Android 创建一个应用程序。所以现在我正在构建一个他们都可以使用的 webapi,但我想保护它,然后我的应用程序可以使用它。我该怎么做?没有其他人然后我的应用程序将访问这些 API。

我不想实现 OAuth。

我有两个我正在考虑的场景:

首先(我在客户端存储用户名和哈希密码):

  • 通过 https/ssl 的基本身份验证,就是这样。

第二(我在客户端存储访问令牌):

  • 通过 https/ssl 进行基本身份验证以接收访问令牌。
  • 为了获得访问令牌,用户发送一个请求 requestoken 一个令牌,验证客户端和服务器都知道客户端密钥。
  • 对于对 API 的每次调用,都必须发送访问令牌以检查访问权限

我看到第二种方法的问题是服务器将 accesstoken 发送到客户端,如果有人从哪里得到它,他们将拥有用户的访问权限。

在现实世界中是如何做到的?

4

1 回答 1

1

您可以对First稍作修改:

  • 在客户端存储用户名和密码
  • 基于 https 的基本身份验证

在客户端存储一个密码散列,然后发送散列并与数据库中的散列进行比较,相当于在数据库中存储一个纯文本密码,因为散列变成了密码。因此,您的应用程序应该像任何人类用户一样使用用户名和密码进行身份验证。

但是您对第二种方法的担忧也适用。如果有人截获了消息,他就有了你的凭据。

更安全的解决方案是HMAC 身份验证(现在我们正在谈论“真实世界”)。

  • 用户有一个存储在服务器和客户端上的密钥
  • 每个请求都被规范化(转换为不同的字符串,其中包含请求方法、URI、参数和时间戳)
  • 规范化的请求使用密钥与 HMAC 进行散列,散列和用户 ID 在 HTTPAuthorization标头中传递
  • 在服务器上,使用相同的算法(带有来自 HTTPDate标头的时间戳)生成散列,并与发送的散列进行比较。
  • 如果结果相等,则请求通过身份验证

一个示例是Amazon S3 REST API - 链接的文档也是如何为您自己的 API 实现它的一个很好的示例。

于 2013-02-12T18:04:34.063 回答