【问题标题】:Distributing and using API-keys for web-applications为 Web 应用程序分发和使用 API 密钥
【发布时间】:2011-07-13 12:50:15
【问题描述】:

我有一个 Web 应用程序,我正在为其构建一个 Drupal 模块,允许我的客户访问我的应用程序上的某些数据。

我打算向需要在他们的 Drupal 模块副本中输入该值的客户分发秘密 API 密钥。然后这个 Drupal 模块与我的 web 应用程序对话,但我需要确保 POST 请求确实来自该源。

如何使用这个“密钥”传递一些信息,当我的应用程序收到它时,它知道:

(a) its from that client's server.
(b) it hasnt been eavesdropped on / copied and used by someone else?

我是否应该使用此 API 密钥作为密码来加密与 POST 请求的其余部分匹配的某些数据?收到它时,我使用我的 API 密钥副本对其进行解密,如果它与其余数据匹配,我认为它已验证?

有没有为我做这件事的框架? Zend 内部的东西?

【问题讨论】:

    标签: php security web-applications api-key


    【解决方案1】:
    1. 收集并存储每个客户端传入的 url(例如www.authorisedclienturl.com)作为参数的一部分,您将在生成要与客户端共享的 API 密钥之前存储在服务器上。
    2. 客户端将使用 HTTPS 仅从其注册的授权客户端 url 发送请求 boby 中的 API 密钥。
    3. 使用 API 密钥在您的服务器上解密客户端信息并检索注册的客户端 url,验证传入的请求 url 是否存在于注册的 url 中,然后接受并继续其他流程。

    【讨论】:

      【解决方案2】:

      使用 HTTPS 并在请求中发送 API 密钥。就这么简单。

      如果您使用 HTTP,那么您将重新发明轮子。

      更新:

      这是阅读 cmets 后的更新,因为在问题中您没有解释您想将 API 密钥提供给网站的访问者(在这种情况下,无论您做什么都会被搞砸)。

      juanpaco 的评论解释了要做什么(以及我最初认为你在做什么),但我会尝试更详细地解释它。

      最重要的是您不要在 Web 表单中使用 API 密钥。 API 密钥仅用于您的客户服务器和您的 API 服务器之间的通信。

      这里是一个简化的解释:

      1. 您为您的客户提供了一个密钥和一些软件/模块/库以安装在他的服务器上。
      2. 当访问者访问您客户的网站时,他会看到您的模块生成的一些 HTML不包含任何 API 密钥,并且只能与您客户的服务器通信(如果有任何敏感信息,则使用 HTTPS 或所涉及的用户帐户)。
      3. 客户服务器上的模块获取访问者的请求。
      4. 您的模块使用 API 密钥(使用 HTTPS)连接到您的服务器。
      5. 您的 API 服务器响应客户的服务器。
      6. 客户的服务器响应访问者。

      您的 API 密钥绝不会以明文形式发送并且绝不会提供给网站访问者

      这是使用 API 密钥的唯一合理方式,在我第一次阅读您的问题后,我认为您担心在服务器和客户服务器之间发送 API 密钥的安全性。

      如果您的客户将他们的密钥交给他们网站的每位访问者,那么无论您如何努力,这些访问者总是能够认识他们。为访问者提供 API 密钥并使其可以使用但无法读取是不可能的。不难 - 不可能。无论您使用什么协议、加密或任何东西。

      (感谢 juanpaco 让我注意到这个旧答案。)

      【讨论】:

      • HTTPS 不会禁止重新分发如果 API 密钥,所以它只解决了他的部分问题。
      • @wimvds:确实如此。我想说,找到一种方法来生成不可再分发的比特是一个难题。
      • @Zed, @wimvds - 在我开始使用 https 后,有什么方法可以增加额外的安全层吗?如果我不使用 https 和 http,我该怎么办?
      • @Zed, @wimvds - 对通过 https 执行此操作后我能做些什么有任何进一步的想法吗?
      • @Zed - 我必须通过用户可见的 FORM 发送此信息,以便 apikey 清晰可见。如何确保这些数据的传输安全?
      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 2012-10-07
      • 2011-06-11
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      相关资源
      最近更新 更多