为Web应用程序分发和使用API​​密钥

时间:2011-03-11 14:08:54

标签: php security web-applications api-key

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

我打算将秘密API密钥分发给需要在Drupal模块副本中输入该值的客户。然后,这个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中的东西?

1 个答案:

答案 0 :(得分:4)

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

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

更新

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

juanpaco的评论解释了该怎么做(以及我最初假设你正在做的事情),但我会尝试更详细地解释它。

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

这是一个简化的解释:

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

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

    如果您的客户要将他们的密钥交给他们网站的每个访问者,那么这些访问者将始终能够了解他们,无论您尝试多么努力。为访问者提供API密钥并使其可以使用但无法阅读是不可能的。不难 - 不可能。无论使用什么协议,加密或任何您使用的。

    (感谢juanpaco将这个旧答案引起我的注意。)