2

我正在开发我的应用程序的 Restful API 层。该应用程序将用于不支持 HTTPS 的场所。我们需要同时支持网络应用和移动应用。我们在服务器端使用 Node/Expressjs。我的两个担忧是:

  • 有没有一种方法可以在没有 HTTPS 的情况下设置安全身份验证?

  • 有没有一种方法可以在 Web 应用程序(backbonejs)和本机移动应用程序(iOS)上重用相同的身份验证层?

4

3 回答 3

3

我认为您混淆了真实性机密性。完全有可能创建一个 API 来安全地验证调用者是他们所说的使用MAC的人;最常见的是HMAC。不过,假设是你已经安全地建立了一个共享的秘密——你可以亲自去做,但这很不方便。

Amazon S3 是一个无需 SSL/TLS 即可对其请求进行身份验证的API示例。它通过规定调用者根据 HTTP 请求的各个部分创建 HMAC 的特定方式来做到这一点。然后它验证请求者实际上是允许请求该对象的人。Amazon 在注册时最初依赖 SSL 来建立您的共享密钥,但不需要 SSL 来正确执行 API 调用,该调用可以被安全地验证为来自授权个人(可以是普通的旧 HTTP)。

现在这种方法的缺点是任何人都可以看到双向传递的所有数据。虽然发送的授权数据不允许攻击者冒充有效用户,但攻击者可以看到您传输的任何内容,因此在许多情况下需要保密。

使用 S3 公开传输 ​​API 响应的一个用例包括其代码托管在一台服务器上的网站,而其图像等托管在 S3 中。网站通常使用S3 的查询字符串身份验证来允许浏览器在一小​​段时间内直接从 S3 请求图像,同时还确保网站代码是唯一可以授权浏览器检索该图像的代码(从而向所有者收费带宽)。

允许使用非 SSL 请求的 API 身份验证机制的另一个示例是OAuth。它是过时的 1.0系列专门使用它(即使您使用 SSL),并且OAuth 2.0规范定义了几种访问令牌类型,包括OAuth2 HTTP MAC类型,其主要目的是简化和改进不愿或无法使用的服务的 HTTP 身份验证使用每个请求的 TLS(尽管最初建立秘密确实需要 SSL)。虽然OAuth2 Bearer类型需要 SSL,并且让事情变得更简单(没有标准化; 所有使用所有请求签名 API 的开发人员的祸根,但没有经过完善和测试的库)。

总而言之,如果您所关心的只是安全地确定请求的真实性,那是可能的。如果您在传输响应期间关心机密性,则需要某种传输安全性,并且 TLS 更容易在您的应用程序代码中正确使用(尽管其他选项可能是可行的)。

于 2012-08-09T02:08:37.660 回答
0
  • 有没有一种方法可以在没有 HTTPS 的情况下设置安全身份验证?

如果您指的是 SSL,则不会。您通过浏览器发送到 Web 服务器的任何内容都将是未加密的,因此第三方可以收听。HTTPS 不是身份验证,它对客户端和服务器之间的流量进行加密。

  • 有没有一种方法可以在 Web 应用程序(backbonejs)和本机移动应用程序(iOS)上重用相同的身份验证层?

是的,正如你所说,它是层,所以它的接口将独立于客户端,它将是 HTTP,如果 web 应用程序与该层同源,则不会有问题。(例如从 myapp.com 访问的 api.myapp.com)。您的本机移动设备也可以发出 HTTP 请求。

于 2012-04-24T19:19:30.670 回答
0

在 SSL 或非 SSL 的任何一种情况下,如果您使用私钥/公钥场景,您需要用户在发送之前对每个请求进行签名,那么您可以是安全的。收到请求后,您可以使用他们的私钥(不是通过网络发送)对其进行解密,并匹配签名的内容和用户请求的操作,并确保这两者匹配。您将其基于 UTC 时间戳,这还要求所有使用此模型的服务器的时钟设置都非常准确。

Amazon Web Services 尤其使用这种安全方法,尽管他们不推荐它,但它在不使用 SSL 的情况下也足够安全。

我会认真地投入一些小改动来支持 SSL,因为它可以让您在这样做时更有可信度。我个人不会认为没有一个你是一个可信的组织。

于 2012-04-24T21:06:03.697 回答